获取远程仓库的更新
我们可以使用 git fetch
或者 git pull
两个命令从远程仓库获取最新的提交和分支信息,两者区别如下:
git fetch
:该命令将远程仓库的最新更改下载到本地,但不会自动合并到当前分支。你可以随后使用其他命令(如git merge
或者git rebase
)来合并或应用这些更改。git pull
:该命令从远程仓库获取最新更改,并自动将其合并到当前分支。它实际上是git fetch
和git merge
的组合操作。
git fetch
css
git fetch [<remote_repo>] [<branch>] [--all] [--prune] [--tags] [--prune] [--dry-run]
<remote_repo>
(可选):指定要获取更新的远程仓库的名称,不指定则拉取当前仓库的更新。<branch>
(可选):指定要获取更新的远程仓库分支的名称,不指定则拉取当前分支的更新。--all
(可选):获取所有远程仓库的更新。--prune
(可选):在获取更新时,删除本地仓库中已经不存在于远程仓库的引用,以保持同步。--tags
(可选):同时获取远程仓库中的标签。--dry-run
(可选):模拟运行,显示将要获取的更新,但不会实际执行获取操作。--depth=<number>
(可选):通过指定<number>
来限制获取的深度,即需要获取更新的仓库的提交记录数量,如果不指定则将获取完整的更改记录。
git pull
css
git pull [<remote_repo>] [<branch>] [--rebase] [--no-rebase] [--ff-only] [--ffy] [--no-commit] [--squash] [--autostash]
<remote_repo>
(可选):指定要获取更新的远程仓库的名称,不指定则拉取当前仓库的更新。<branch>
(可选):指定要获取更新的远程仓库分支的名称,不指定则拉取当前分支的更新。--rebase
(可选):使用变基(rebase)而不是合并(merge)来合并远程分支的更改。变基可以产生一个更整洁的提交历史,但也可能导致冲突更难以解决。使用git pull --rebase
可以在拉取远程更改之前将本地提交变基到远程分支的顶部。--no-rebase
(可选):禁用变基选项,强制使用合并(merge)来合并远程分支的更改。这是git pull
命令的默认行为。--ff-only
(可选):只允许快进合并(fast-forward merge)。如果远程分支的历史可以直接应用到本地分支而不需要创建新的合并提交,那么合并将会成功。如果不能进行快进合并,则会失败。--ff
(可选):尝试进行快进合并,如果无法进行快进合并,则不进行合并。--no-commit
(可选):拉取远程更改后不自动生成合并提交。这个选项可以让你在合并之前进行其他操作,例如检查更改或解决冲突,然后手动提交合并结果。--squash
(可选):将所有拉取的提交压缩成一个单独的提交。这个选项适用于你想要将远程更改合并为一个更高层次的提交的情况。--autostash
(可选):在拉取之前自动储藏(stash)当前分支上的未提交更改,并在合并后重新应用这些更改。这对于在拉取过程中避免冲突非常有用。
推送
当你把更改提交到本地仓库后,可以使用 git push
命令将这些更改推送到远程仓库,这样其他协作者就可以看到并获取你的更改。
下面是git push
命令的一般用法:
css
git push <remote_repo> <branch> [-u] [-f] [--all] [--tags] [--dry-run]
<remote_repo>
(可选):指定推送到远程仓库的名称,不指定则为当前仓库。<branch>
(可选):指定推送到远程仓库分支的名称,不指定则为当前分支。-u
或--set-upstream
(可选):在推送的同时,将本地分支与远程分支进行关联。这样,下次你可以直接使用git push
命令进行推送,而不需要显式指定远程仓库和分支。-f
或--force
(可选):强制推送更改,即使这样可能会覆盖其他人的提交。这个选项应该谨慎使用,因为它可能会导致数据丢失或冲突。只在你确信需要覆盖远程分支的情况下才使用它。--all
(可选):推送所有分支到远程仓库。默认情况下,git push
只会推送当前分支。使用该选项可以将所有本地分支推送到远程仓库。--tags
(可选):推送标签到远程仓库。标签是用于标记特定提交的引用。使用该选项可以将本地的标签推送到远程仓库。--dry-run
(可选):模拟推送操作,而不进行实际的推送。这个选项可以让你在推送之前预览将要进行的操作,以确保没有意外的结果。
合并
合并(Merge)是将一个分支的更改合并到另一个分支的操作。在Git中,有几种合并策略可以使用,具体取决于你想要实现的合并结果。
快进合并
快进合并(Fast-forward merge)当一个分支的提交历史可以直接应用到另一个分支时,Git会执行快进合并。这种合并不会创建新的合并提交,而是简单地将目标分支指向源分支的最新提交。这种合并只适用于目标分支没有自己的新提交的情况。
bash
# 切换到目标分支
git checkout main
# 执行快进合并
git merge Feature
普通合并
普通合并(Regular merge)当两个分支都有新的提交时,Git会执行普通合并。这种合并会创建一个新的合并提交,它有两个父提交,代表了两个分支的更改。在合并过程中,Git会尝试自动解决冲突,但如果有冲突无法自动解决,你需要手动解决冲突后再进行提交。
bash
# 切换到目标分支
git checkout main
# 执行普通合并
git merge Feature
递归合并
递归合并(Recursive merge)是一种特殊的普通合并,它在多个分支之间存在合并关系时使用。当你在一个分支上合并另一个分支,而另一个分支又合并了其他分支时,就会发生递归合并。在这种情况下,Git会创建一个新的递归合并提交,它有多个父提交,代表了多个分支的更改。
bash
# 切换到目标分支
git checkout Main
# 执行递归合并
git merge Fix_Bug Feature
需要注意的是,合并可能会引起冲突, 特别是当两个分支在相同的文件的相同位置进行了不兼容的更改时。在这种情况下,Git会标记冲突,并将冲突的文件标记为未解决状态,你需要手动解决冲突 ,然后使用git add
命令将解决后的文件标记为已解决,最后执行git commit
提交合并结果。
变基
变基(rebase)操作是 Git 中的一种常见操作,它允许将一个分支的提交应用于另一个分支上,从而改变提交历史的结构,变基操作实际上是通过将一系列提交复制到另一个基准上来实现的。
在变基操作中,你会选择一个基准分支,以及目标分支,然后将基准分支的提交复制到目标分支上。这样可以使目标分支的提交看起来好像是基于基准分支的最新状态进行开发的。
下面是变基操作的一般步骤:
- 确保你在基准分支上进行操作:首先,确保你位于要进行变基操作的基准分支上(假设你要将dev变基到main,那么你应该位于dev分支),可以使用
git branch
命令查看当前分支,并使用git checkout
命令切换到基准分支。 - 执行变基操作:运行
git rebase
命令,指定要进行变基操作的目标分支。例如,你要将dev变基到main,那么你应该位于dev分支,并且运行git rebase main
。 - 解决冲突(如果有):在变基过程中,如果存在冲突,Git 会暂停变基操作,并提示你解决这些冲突。你需要手动编辑文件,解决冲突后,使用
git add
命令将文件标记为已解决。 - 完成变基操作:当所有冲突都解决完毕后,使用
git rebase --continue
命令继续变基操作,或者使用git rebase --abort
命令放弃变基操作。 - 合并分支:切换分支到目标分支,然后执行
git merge
命令,指定要合并的基准分支。例如你要将dev变基到main,这个步骤中,你应该位于main分支,并且运行git merge dev
。
交互式变基
通过 git rebase --interactive
命令,你可以打开一个文本编辑器进行交互式变基操作,文本编辑器将显示当前分支的提交历史,并允许你对每个提交进行操作,例如修改提交消息、合并、删除或重新排序提交等。
命令的语法如下:
css
git rebase --interactive <branch>
<branch>
(可选):指定目标分支。
运行该命令后,Git 将打开一个文本编辑器,并显示一个类似于以下的界面:
sql
pick 3f4b03e Commit message 1
pick b2a5c1d Commit message 2
pick 8de1a2f Commit message 3
# ...
每个提交都以 pick
开头,后面是提交的哈希值和提交消息。在编辑器中,你可以对每个提交进行以下操作:
pick
:保持提交不变。reword
:修改提交消息。edit
:编辑提交的内容。squash
:将该提交合并到前一个提交中,并将提交消息合并为一个。fixup
:将该提交合并到前一个提交中,但丢弃提交消息。drop
:移除该提交。
在编辑器中进行适当的修改后,保存并关闭编辑器,Git 将按照你的修改执行相应的操作,并重新应用提交历史。
高级变基操作
假设我们有一个示例存储库,其分支如下:
css
o---o---o---o---o main
\
o---o---o---o---o featureA
\
o---o---o featureB
featureB 基于 featureA,但是featureB 其实并不依赖于 featureA 的任何更改,我们想要把featureB从feature A分离出来,应用到main分支中。此时就需要使用--onto
高级变基命令!
css
// 切换到featureB分支
git rebase --onto main featureA featureB
// 切换到main分支
git merge featureB
执行高级变基操作后,分支如下:
css
o---o---o featureB
/
o---o---o---o---o main
\
o---o---o---o---o featureA
高级变基命令的语法如下:
xml
git rebase --onto <newbase> <oldbase> <branch>
<newbase>
(可选):指定变基后的目标分支,所有变基操作的提交将被复制到该分支。如果不提供<newbase>
参数,则默认为当前分支。<oldbase>
(可选):指定变基操作的起点。如果不提供<oldbase>
参数,则默认为当前分支的上一个提交。<branch>
(可选):指定要进行变基操作的分支。如果不提供<branch>
参数,则默认为当前分支。
转载需要经过本人同意,并标明出处!