我熟悉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
如果有任何冲突将被显示。我需要解决的问题。
任何人都可以帮助我,无论我的理解是否正确。如果没有,请帮助我正确理解这个概念。提前谢谢。
答案 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
这个词。我相信您所描述的是您使用Module
将B
分支指针移回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 pull
是git fetch
,后跟git merge
,因此可以认为它等同于:
git fetch origin module1
git merge origin/module1
正如您所说的那样,Module
中当前分支中不存在的任何更改都将合并(N.B。故意假设没有变基)。如果存在git无法解决的合并冲突,则需要手动解决冲突。
一些方便的链接:
答案 1 :(得分:-1)
两个查询的答案应根据不同的情况而有所不同:
feature1
分支从最新的module1
分支分支出来(在创建module1
分支后,feature1
分支上没有提交。)提交历史记录如下:
---A---B---… master
\
C---D---E module1
\
F---G---H feature1
module1
分支推送到远程feature1
分支,则可以让您成功,远程仓库中的module1
分支将指向提交H
。 module1
提取到本地feature1
分支,则不会将任何提交提取到您的本地feature1
分支。它会说已经是最新的。module1
分支后feature1
分支上有新的提交。提交历史记录如下所示:
---A---B---… master
\
C---D---E---I---J module1
\
F---G---H feature1
module1
分支推送到远程feature1
分支,git将停止推送并提示您先提取,因为提交I
和J
in feature1
分支中不存在上图。module1
提取到本地feature1
分支,它会将更改从origin/module1
分支合并到feature1
分支(如您所愿)。即使拉/推到不同的分支也可以作为快进或合并,但你最好在它自己的本地分支上执行pull / push 。它可以使不同分支上的工作更加干净。