Git pull vs Git Rebase head version



通常这就是我将代码合并推送到主的方式

方法1:

git pull origin master
git add -A
git commit -m 'message'
git push

后来发现拉不是有线性历史的正确方法,我应该重新调整基础,然后推

我目前在做什么

方法2:

git checkout LocalBranch
git rebase master[resolve conflicts]
git add -A
git commit -m 'message'
git push

问题:

当我用方法1做事时,它说已经是最新的了如果我使用方法2,它会引发很多冲突,并且在解决后,我无法推送代码。

问题:

  1. 为什么git pull master(5abc)git rebase master(4def)指向不同的master头版本
  2. git pullgit rebase在任何时候都不会到达同一版本的master

我认为您需要清楚git pull的工作。从远程(即(提取代码的位置(可以是GitHub、GitLab、BitBucket等(会导致git变为git fetchgit merge。那是什么意思?

这意味着它首先获取您的代码和远程代码之间的差异(例如,假设远程上有两个"额外"提交(,然后尝试将这些差异合并到代码库中。现在,如果这两个提交与您在代码上进行的提交无关(比如创建一个新文件(,这可以顺利进行。但是,如果代码的同一部分发生了更改,那么假设您的代码是:

int a = 4;
bool x = false;

但合并想要成功:

int a = 5;
bool x = false;

这会产生合并冲突,因为您的代码说a是4,但合并说它是5,git应该考虑哪一个?因此,您在提取代码时会得到merge conflict的提示。您需要手动解决这些问题才能使事情正常运行。

git rebase master可帮助您将LocalBranch中的提交重新应用到master上。这意味着它占用您的工作树,并试图将其与主工作树融合。有关此过程的详细分析,请参见此。回扣意味着,无论您做出了什么提交,所有提交都将应用于master之上(如果您愿意,甚至可能介于两者之间;(。请观看此视频以获得更好的想法。由于这个过程是一个循序渐进的过程,它会让你进入一个不同的提交(首先要重新确定的提交(。

git pull(特别是merge步骤(将进行"差异"提交,并尝试将其merge放入主工作树中。只有在完成此过程后,才能进行addcommit,最后进行push

此外,我想给你一个提示,使用交互式rebase,即git rebase -i来进行rebase,因为它为你提供了一个交互式界面来帮助你重新base。

如果还有任何困惑,请随时发表评论!:(

最佳

PS:rebase的情况下,您可以进行强制推送,以便能够将更改推送到遥控器上。

方法1具有线性历史的正确替代方案是:

git add -A
git commit -m message
git fetch origin
git rebase origin/master [resolve conflicts]
git push 

最新更新