在gerrit上面开发,必然免不了拉取代码,如果一个项目多人开发,避免不了会有一些冲突,而这个冲突大部分就是在拉代码的时候出现的,今天我就来梳理一下拉代码的不同方式及其区别。
今天主要讲一下git pull --rebase 和 git pull origin dev ,它们都是从远程仓库拉取更新的命令,但它们的行为有所不同。接下来让我逐一解释这两者的区别。
1. git pull --rebase
这个命令的作用是拉取远程仓库的更新,并且在本地分支上 重排 你的本地提交,使本地提交位于远程分支的最新提交之后,而不是合并它们。 具体过程是:
- 先拉取远程分支上的更新。
- 然后将你本地的提交 逐一 应用(即重排)在远程分支的最新提交之后,而不是通过合并产生一个新的合并提交。
举个例子:
假设你的本地分支是 feature,远程分支是 origin/feature,而你在本地做了一些提交。远程的 origin/feature 分支上也有更新。
- 执行
git pull --rebase后,Git 会:-
获取远程分支的最新提交。
-
将本地未推送的提交 "移到" 远程分支的后面,而不是合并它们。
-
这种方法保持了提交历史的整洁,避免了不必要的合并提交,适用于线性的开发历史。
这个线性开发怎么理解呢,就是同一个文件,今天小明改了,小红拉的时候用git pull --rebase命令,意思就是我承认你的修改并直接拉下来了,虽然我也有修改但我先保留,等你的代码拉下来并更新这个文件之后,我再把我的代码提交上去。
如果两人代码有冲突了,它会给出这样的提示:
<<<<<<< HEAD
本地修改的代码
=======
远程分支的代码
>>>>>>> commit-hash
需要你手动去解决冲突就好了,多人协作时冲突的地方不会太多,这个命令的好处就是可以第一时间拉到同事的更新,避免后面你改到他的页面时还未更新导致新的冲突。
所以为什么用gerrit开发的团队都要求当日代码当日提交,就是为了方便第二天的同事用git pull --rebase拉代码。
2. git pull origin dev
这个命令的作用是拉取远程 dev 分支的最新更改,并将其合并到当前分支(比如 feature)上。
具体过程是:
- 先从远程仓库获取
dev分支上的更新。 - 然后将这些更新合并到你当前的本地分支中(例如,如果你当前在
feature分支上,就会合并远程的dev分支的更改到本地的feature分支)。
这通常会产生一个合并提交,除非你已经完全同步了远程分支的最新更改。
举个例子:
假设你当前在 feature 分支上,而远程的 dev 分支有新的提交,执行:
git pull origin dev
- Git 会拉取远程
dev分支的最新更改。 - 然后将这些更改 合并 到你当前的
feature分支上,如果本地有修改和冲突,Git 会提示你解决冲突。
很明显,用git pull origin dev 在大部分情况下都不可避免地要处理代码冲突,而且这个冲突大概率会很多,有时会多到你崩溃,谨慎使用!
区别总结:
| 命令 | 作用 | 结果 |
|---|---|---|
| git pull --rebase | 拉取远程更改,并将本地提交 "重排" 在远程提交之后。 | 保持线性历史,避免额外的合并提交,适合持续集成开发。 |
| git pull origin dev | 拉取远程 dev 分支的更新,并合并到当前分支。 | 会创建一个合并提交,如果有冲突需要解决,适用于开发中常见的合并。 |
何时使用:
git pull --rebase:如果你希望保持提交历史简洁、线性,且不想在合并分支时产生额外的合并提交,可以使用--rebase。通常适用于个人开发或在多人协作中频繁同步远程更新的情况。git pull origin dev:如果你希望将远程dev分支的内容合并到当前分支,特别是在开发过程中,常常需要合并其他人的更改时,使用这个命令比较合适。
总之,git pull --rebase 是一种更“清晰”的方式,因为它不会让提交历史中充满合并记录,而 git pull origin dev 则更多地保留了合并历史,适用于多人协作时的常规更新。