当Git拉动或推送到其他分支中的不同分支时会发生什么

时间:2017-12-21 09:45:29

标签: git version-control dvcs

我熟悉GIT并将其用于我的项目的版本控制。

我想知道的问题很少。我用Google搜索,但无法得到好的答案。

所以问题是我有 master,module1,feature1 分支。

master
 ---------- 
         | module1
         ----------
                  | feature1
                  ------------

module1从master分支,feature1从module1分支。

查询1 :在feature1分支中,如果我处理一些更改并提交并将其推送到module1,该怎么办。

git add .
git commit -m "Changes of feature1"
git push origin module1 //Being in feature1 branch

这里发生了feature1到module1分支的代码以及module1分支如何接受它。

我的理解:根据我的理解,feature1更改将被推送到module1分支。后来我意识到我应该推送到feature1分支,然后我将同样推送到feature1分支,并将checkout到module1分支并恢复我最近推送的代码。

查询2 :如果在feature1分支中,我通过以下方法在此分支中提取module1的代码

git pull origin module1 //Being in feature1 branch

我的理解:module1代码的更改将合并到我的feature1分支,并且与命令中的以下内容相同

git checkout moduel1
git pull origin module1
git checkout feature1
git merge module1

如果有任何冲突将被显示。我需要解决的问题。

任何人都可以帮助我,无论我的理解是否正确。如果没有,请帮助我正确理解这个概念。提前谢谢。

2 个答案:

答案 0 :(得分:1)

你大致正确。我想关于git分支的一些教程,或者对简单存储库的一些一般性实验将有助于巩固你对你所描述的情境中发生的事情的理解。

对于您的具体问题,如果我们假设您已经两次分支,并且未做出任何提交:

Master  |  A -> B 
--------        ^ 
Module  |       | (B)  
--------        ^ 
Feature |       | (B) 

查询1:如果您正在处理Feature分支,提交了一些更改并将其推送到Module,该怎么办?

首先你做了一些新的提交,让我们在Feature上再说两次提交:

Master  |  A -> B 
--------        ^ 
Module  |       | (B) 
--------         \
Feature |         C -> D

然后您将该更改推送到Module,假设没有在Module上提交任何其他更改,您可以像这样表示更改图:

Master  |  A -> B 
--------         \ 
Module  |         C -> D
--------               ^
Feature |              | (D)

来自Feature的提交只是应用于Module分支的顶部(假设快进合并);更准确地说,Module分支指针被移动到提交“D”,因此它基本上指向与Feature相同的一系列提交。注:我故意不提及强制合并提交,重新定位或其他潜在的复杂情况。

然后您决定不想在Module branch上进行这些更改,这里潜在的复杂因素是您使用了revert这个词。我相信您所描述的是您使用ModuleB分支指针移回git reset <commit hash for B>,这基本上是resets您的状态到推送前的状态您对Module的更改。

Master  |  A -> B 
--------        ^ 
Module  |       | (B) 
--------         \
Feature |         C -> D

注意,如果您使用git revert <commit hash to revert>实际提交了reverted,那么您将在Module分支中创建新的提交,这将撤消引入的更改。我有理由相信这不是你所描述的。

查询2:您的理解基本上是正确的。 git pullgit fetch,后跟git merge,因此可以认为它等同于:

git fetch origin module1
git merge origin/module1

正如您所说的那样,Module中当前分支中不存在的任何更改都将合并(N.B。故意假设没有变基)。如果存在git无法解决的合并冲突,则需要手动解决冲突。

一些方便的链接:

答案 1 :(得分:-1)

两个查询的答案应根据不同的情况而有所不同:

情况1:feature1分支从最新的module1分支分支出来(在创建module1分支后,feature1分支上没有提交。)

提交历史记录如下:

---A---B---…    master
        \
         C---D---E    module1
                  \
                   F---G---H   feature1
  • 如果您将更改从本地module1分支推送到远程feature1分支,则可以让您成功,远程仓库中的module1分支将指向提交H
  • 如果您将更改从远程module1提取到本地feature1分支,则不会将任何提交提取到您的本地feature1分支。它会说已经是最新的。

情况2:分支module1分支后feature1分支上有新的提交。

提交历史记录如下所示:

---A---B---…    master
        \
         C---D---E---I---J    module1
                  \
                   F---G---H   feature1
  • 如果您将更改从本地module1分支推送到远程feature1分支,git将停止推送并提示您先提取,因为提交IJ in feature1分支中不存在上图。
  • 如果您将更改从远程module1提取到本地feature1分支,它会将更改从origin/module1分支合并到feature1分支(如您所愿)。

即使拉/推到不同的分支也可以作为快进或合并,但你最好在它自己的本地分支上执行pull / push 。它可以使不同分支上的工作更加干净。