草庐IT

git版本管理:分支合并常用命令

倪偲001 2023-08-07 原文

常用命令

git clone <repo-url> # 拷贝项目到本地
git branch <new-branch> # 创建新分支
git checkout <new-branch> # 切换到新分支
git checkout -b <new-branch> # 创建并切换到新分支

git fetch <repo-name> <branch-01> # 从远程获取repo
git pull <repo-name> <remote-branch>:<local-branch> # 获取远程remote分支,合并到本地local分支
git pull # 获取并合并到本地当前分支

git add . # 添加全部改动
git commit -m "msg" # 提交当前分支到本地
git push <repo-name> <local-branch>:<remote-branch> # 提交本地更改到远程
git push origin <new-branch># 提交新的本地分支,这里的origin就是默认的<repo-name>

git checkout main # 切换回主分支
git merge <new-branch> # 合并其他分支<new-branch>到main
git branch -d <old-branch> # 删除已经用完的分支<old-branch> 

git reset --hard origin/master # 直接用fetch的线上版本覆盖本地分支
git reset HEAD # 回退到上一版本
git restore --staged readme.md 
git checkout -- readme.md

常用命令在这里:https://www.runoob.com/git/git-basic-operations.html

fetch and remote

全部来自这个知乎专栏:杨世伟

远程repo

git remote -v(这个命令没什么用)

默认执行git remote命令后会列出之前设置过的所有远端仓库的别名

$ git remote

展示当前关联的其他仓库列表

$ git remote -v

与上面的命令一样,但是输出会包含每一个仓库的URL.

$ git remote add <repo-name> <repo-url>

上面的命令创建了一个与远端仓库的关联关系。在此之后,你就可以使用作为这个仓库的别名在其他git命令中使用。

$ git remote rm <name>

删除别名为的远端仓库的关联关系。

$ git remote rename <old-name> <new-name>

将别名为< old-name>的远端仓库的关联关系重命名为< new-name>。

HTTP 还是 SSH

Git支持通过很多方式来访问远端仓库。其中最简单的两种方式是通过HTTP和SSH协议。HTTP协议通常用于允许匿名只读访问仓库。比如:

http://host/path/to/repo.git

但是,通常来说通过HTTP地址的访问都无法进行push操作(应该不会有人愿意让匿名用户进行push操作)。对于可读可写的操作,应该使用SSH协议

ssh://user@host/path/to/repo.git

通过SSH协议访问时,Git托管主机上应该有你的一个合法SSH账号,除此之外你无需进行其他任何配置,Git的具名SSH访问能力是开箱即用的。通常第三方托管平台,会提供你的Git项目的URL。

SSH如何使用

实测还是ssh好用

一旦生成ssh key之后就不用像https一样每次都输入临时密码了。

下面这篇笔记讲了如何使用SSH key :
印象笔记——dev.azure uses SSH key to git clone

git pull=git fetch+git merge

git fetch

git pullgit fetch 这两个命令都可以用于下载远端仓库。你可以认为git fetch是这两者中更加安全的那个,即便下载了远端的内容,但也不会更新你本地仓库的版本状态,以保证你本地当前代码完好无损。反观git pull命令则是一个更加激进的命令,它会下载当前正在工作的分支对应的远端内容,并且在下载成功之后马上执行一个git merge命令,为新下载下来的远端内容创建一次merge commit。此时如果你有正在进行中的工作还没准备好进行合并,这些行为可能会造成代码冲突,然后马上进入合并代码过程中解决冲突的流程。

获取远程分支1

以下来自 知乎专栏——同步GIT仓库的操作 – fetch命令

git fetch <remote>

Fetch仓库中所有分支。同时也会下载指定远端的所有commits和文件。

git fetch <remote> <branch>

与上面的命令同样,但只会fetch指定分支。

git fetch --all

fetch所有已注册过的远端仓库的全部分支。

获取远程分支2

以下来自 菜鸟教程——git fetch 命令

假设你配置好了一个远程仓库,并且你想要提取更新的数据,你可以首先执行:

git fetch [alias]

以上命令告诉 Git 去获取它有你没有的数据,然后你可以执行:

git merge [alias]/[branch]

以上命令将服务器上的任何更新(假设有人这时候推送到服务器了)合并到你的当前分支。

git pull origin remote-branch01:local-branch01

将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。

$ git pull origin master:brantest

如果远程分支是与当前分支合并,则冒号后面的部分可以省略。

$ git pull origin master

上面命令表示,取回 origin/master 分支,再与本地的 brantest 分支合并。

$ git pull origin new-branch

branch and merge

使用分支

git branch命令允许对分支进行创建、列举、重命名以及删除的操作。它不能进行切换分支或者将分叉的commit记录扔到其他分支里。因此git branch总是与git checkout以及git merge命令共同出现在使用场景中。

$ git branch <branch-name>

创建一个名为 的分支。但此命令并不会自动检出新创建的分支。

$ git branch -d <branch-name>

删除指定分支。这是一个安全的操作,因为当分支中含有未合并的变更时,Git会阻止这一次删除操作。

$ git branch -m <branch-name>

对于当前分支重命名为。

本地创建并使用分支

$ git branch branch01 # 创建新分支
$ git checkout branch01 # 选择所创建的分支

查看一下现在的分支状态:

$ git branch
    * branch01 
      master
      release

星号(*)表示当前所在分支。现在的状态是成功创建的新的分支并且已经切换到新分支上。创建并选择分支合并为一句:

git checkout -b branch01 

要注意此时你只是创建了这个分支。如需开始对新分支进行提交,要先选择这个新的分支,使用git checkout命令,然后再使用标准流程git addgit commit等命令。
本地分支与远端的联系尽量一致,如果本地相较于远程多出来的,可以删除。
$ git remote rm branch01

过程如下:

$ git checkout branch01
	M	README.md
	切换到分支 'branch01'
$ git add .
$ git commit -m "git branch"
	[branch01 9296183] git branch
	 1 file changed, 3 insertions(+), 1 deletion(-)
$ git push
	fatal: 当前分支 branch01 没有对应的上游分支。
为推送当前分支并建立与远程上游的跟踪,使用    git push --set-upstream origin branch01

可以发现当本地新建分支并要推送的时候,必须要选择是推送哪个分支。

将本地branch提交

$ git push <remote-repo-name> local-new-branch:remote-new-branch# 当地新分支提交到remote origin的新分支

以上命令先添加了远程仓库,然后将本地分支branch01推向远程,如果仓库里没有这一分支,就创建同名的分支。

实际情况没有这么复杂。假如我们实在一个repo上改动,那是不变的,也就是origin。远程分支与本地分支同名

$ git push origin branch01 # 当地分支提交到远程仓库

使用
git branch -a
查看所有分支,会看到
remotes/origin/dbg_lichen_star
这个远程分支,说明新建远程分支成功。

删除远程分支

我比较喜欢的简单方式,推送一个空分支到远程分支,其实就相当于删除远程分支:

$ git push origin :dbg_lichen_star

也可以使用:

$ git push origin --delete dbg_lichen_star

CSDN博客「-FIGHTING-」

合并

merge

如果要合并到main分支,是这样做的

$ git checkout main
$ git merge branch01
$ git push -u origin main

用带参数的git log也可以看到分支的合并情况

$ git log --graph --pretty=oneline --abbrev-commit

知乎 专栏 - Git——如何解决 Git 中的合并冲突?

git reset 强制覆盖本地代码

由于new-branch是在Azure网站上在线更改的,没有本地备份,因此在fetch整个

git强制覆盖:

$ git fetch --all # 拉取所有更新,不同步
$ git reset --hard origin/master # 直接用线上版本覆盖本地分支
$ git pull # 再更新一次

第一个是:拉取所有更新,不同步;

第二个是:本地代码同步线上最新版本(会覆盖本地所有与远程仓库上同名的文件);

第三个是:再更新一次(其实也可以不用,第二步命令做过了其实)

原文链接:【git】强制覆盖本地代码(与git远程仓库保持一致)

全部恢复至某个历史版本

git reset --hard 历史版本号b1c
git push -f origin master # 强制推送

撤回更改

舍弃更改

遇到切换分支时,报错“请在切换分支/合并前提交或贮藏您的修改”,或“尚未暂存以备提交的变更”,那就是:修改了此文件并且没有add和commit.然后你在branch、pull时就会出现此提示。参考:git pull时:对下列文件的本地修改将被合并操作覆盖

$ git restore --staged README.md
$ git checkout -- README.md

执行commit后,还没执行push时,想要撤销这次的commit,该怎么办?

git reset --soft HEAD^

这样就成功撤销了commit,如果想要连着add也撤销的话,–soft改为–hard(删除工作空间的改动代码)。

另外一点,如果commit注释写错了,先要改一下注释,有其他方法也能实现,如:

git commit --amend

这时候会进入vim编辑器,修改完成你要的注释后保存即可。

git 各类撤销命令

1.git add 后撤销:

撤销所有add文件

git reset HEAD .

撤销单个add文件

git reset HEAD -filename

2.git commit 后撤销:

只回退commit的信息,保留修改代码:

git reset --soft head

彻底回退到上次commit版本,不保留修改代码:

git reset --hard head^

说明:
HEAD :当前版本
HEAD^ :上一个版本
–hard 参数会抛弃当前工作区的修改
–soft 参数的话会回退到之前的版本,但是保留当前工作区的修改,可以重新提交

3.撤销所有本地改动代码:

git checkout .

4.本地代码回退到与git远程仓库保持一致

git reset --hard 远程分支名

5.git push撤销:

回滚此次push到服务器的代码:

git log #查看commit的信息
git revert 以前commit的id

此时本地回滚的代码到服务器就可以了

6.git merge 撤销:

git checkout 【行merge操作时所在的分支】
git reset --hard 【merge前的版本号】

查看本地与remote的异同

命令作用
git diff工作区 vs 暂存区
git diff head工作区 vs 版本库
git diff --cached暂存区 vs 版本库

CSDN-DRPrincess博客: Git三大特色之Stage(暂存区)

submodule

自己的项目添加子模块

git submodule add <url> path # 增加子模块

拷贝的项目带有子模块需要进入目录更新

别人写的项目如果有子项目,使用者git clone只能获取他的主程序,而没有这些submodule。如果git clone <repo-url> --recursive仍然不能获取到所有内容。可以尝试

git submodule update # 如果子模块目录下是空的,这样来更新
subpath/ $ git pull # 也可以直接进入子模块目录获取这些

当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,文件夹是空的。此时,只需执行如下命令:

git submodule init
git submodule update
# 或:
git submodule update --init --recursive

完整拷贝带有子模块的项目

git pull --recurse-submodules # update recursively all the submodules

ref

  1. 杨世伟的知乎专栏
  2. 知乎专栏——同步GIT仓库的操作 – fetch命令
  3. 知乎专栏——Git——如何解决 Git 中的合并冲突?
  4. 印象笔记——dev.azure uses SSH key to git clone
  5. 菜鸟教程——git 常用命令
  6. 菜鸟教程——git fetch 命令
  7. CSDN博客——【git】强制覆盖本地代码(与git远程仓库保持一致)
  8. CSDN博客——git pull时:对下列文件的本地修改将被合并操作覆盖
  9. CSDN博客——git commit后,如何撤销commit
  10. CSDN博客——git操作—克隆含有子模块的项目

有关git版本管理:分支合并常用命令的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  3. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  4. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  5. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  6. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  7. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  8. ruby-on-rails - 如何在发布新的 Ruby 或 Rails 版本时收到通知? - 2

    有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:

  9. 华为常用命令 - 2

    system-view进入系统视图quit退到系统视图sysname交换机命名vlan20创建vlan(进入vlan20)displayvlan显示vlanundovlan20删除vlan20displayvlan20显示vlan里的端口20Interfacee1/0/24进入端口24portlink-typeaccessvlan20把当前端口放入vlan20undoporte1/0/10删除当前VLAN端口10displaycurrent-configuration显示当前配置02配置交换机支持TELNETinterfacevlan1进入VLAN1ipaddress192.168.3.100

  10. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

随机推荐