git-pull*after*git-rebase?
我有一个功能分支和一个主分支 主分支已经进化,我的意思是让这些更新尽可能少地偏离主分支 所以我在两个分支中git-pull*after*git-rebase?,git,rebase,Git,Rebase,我有一个功能分支和一个主分支 主分支已经进化,我的意思是让这些更新尽可能少地偏离主分支 所以我在两个分支中git-pull,git-checkout-feature/branch,最后git-rebase-master 现在,我希望一切都能顺利进行,或者出现冲突,我需要在继续重新设置基础之前解决这些冲突,直到所有主提交成功地重新应用到功能分支上 现在,我不明白我的情况到底发生了什么: $>git rebase master First, rewinding head to replay y
git-pull
,git-checkout-feature/branch
,最后git-rebase-master
现在,我希望一切都能顺利进行,或者出现冲突,我需要在继续重新设置基础之前解决这些冲突,直到所有主提交成功地重新应用到功能分支上
现在,我不明白我的情况到底发生了什么:
$>git rebase master
First, rewinding head to replay your work on top of it...
Applying: myFirstCommitDoneOnTheBranch
Applying: myOtherCommitDoneOnTheBranch
$>git status
On branch feature/branch
Your branch and 'origin/feature/feature' have diverged,
and have 27 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
nothing to commit, working tree clean
$>git pull
*load of conflicts*
现在,就我所能理解的,他在拉后的冲突负荷;我不明白拉的必要性。从逻辑上讲,它应该在分支时回滚到master,保存分支上的提交,转发到master上的最新提交,然后应用保存的提交
我不明白
应用
消息指的是什么:什么在哪个版本上应用提交?该有27个和2个不同的提交,每个告诉您现在有27个来自主机的新提交
和分支中的2个新提交,它们在源代码/
中不存在
由于重新基址对origin/
进行了大量更改,因此它不再与origin/
具有公共基址。因此,您不希望在重基后从原点/
提取更改,因为正如您所看到的,所有H***都会松开
如果您知道您的本地分支机构需要在origin/
中进行更改,请在重新设置基础之前将这些更改提取出来
如果您确定自上次推送(如果这是您自己的功能分支,这是一个安全的赌注)以来没有人更改原点
,则可以使用push--force
将它们再次同步。然后origin/
将再次与您的本地分支具有相同的基础,并且该基础将包含所有最新的master
更改。如果master
和feature/branch
的远程版本分别是最新的,则只需重置您的本地功能分支即可
git checkout feature/branch
git fetch origin feature/branch
git reset --hard origin/feature/branch
然后,如果要在主分支中引入更改
git rebase origin/master
tl;dr您应该在master
的基础上更新master
和feature
之前,使用git pull
和git pull--rebase
更新master
和功能在将功能
重新设置在主功能
上的分支基础后,无需执行
git pull
在当前工作流中,git status
的原因告诉您:
您的分支和“起源/特征”已发生分歧,
和分别有27个和2个不同的提交
这是因为您的rebase功能
分支现在有25个新提交,这些提交无法从源代码/功能
访问(因为它们来自主代码
上的rebase),另外还有2个提交,这些提交可以从源代码/功能
访问,但具有不同的提交ID。这些提交包含相同的更改(即,它们是补丁等效的),但它们具有不同的SHA-1哈希值,因为它们基于origin/feature
中的不同提交,而不是您在本地存储库中重新设置它们的提交
这里有一个例子。在master
上执行git pull
之前,假设这是您的历史记录:
A - B - C (master)
\
D - E (feature)
在git pull
之后,master
获得提交F
:
A - B - C - F (master, origin/master)
\
D - E (feature)
此时,您可以在主控
上重新设置功能
,该功能适用于D
和E
:
A - B - C - F (master, origin/master)
\
D - E (feature)
同时,远程分支origin/feature
仍然基于提交C
:
A - B - C - F (master, origin/master)
\ \
\ D' - E' (feature)
\
D - E (origin/feature)
如果您在feature
上执行git status
,git将告诉您,您的feature
分支已分别从源代码/特征代码分支出3(F
,D'
,E'
)和2(D
,E
)提交
请注意,D'
和E'
包含与D
和E
相同的更改,但具有不同的提交ID,因为它们已在F
的顶部重新设置
解决方案是在master
和feature
上执行git pull
,然后在master
上重新设置feature
的基址。但是,由于您可能在功能
上提交了尚未推送到原点
,因此您需要执行以下操作:
git checkout feature && git pull --rebase
避免在源/功能
和本地功能
之间创建合并提交
重新定基的后果的最新情况:
在阳光下,我在分叉的树枝上展开。git status
报告在重新基址后feature
和origin/feature
出现分歧的原因是,重新基址为feature
带来了新的提交,加上它重写了以前推送到origin/feature
的提交
考虑拉动后但重新基准前的情况:
A - B - C - F (master)
\
D - E (feature, origin/feature)
C' (feature)
B'
A'
* (master, origin/master)
*
*
| C (origin/feature)
| B
| A
|/
* some base commit
此时,feature
和origin/feature
指向相同的提交E
——换句话说,它们处于“同步”状态。在将功能
重定为主功能
的基础上,历史将如下所示:
A - B - C - F (master)
\ \
\ D' - E' (feature)
\
D - E (origin/feature)
A - B - C - F (master)
\
D - E - F' (feature)
^
(origin/feature)
如您所见,feature
和origin/feature
已经分开,它们的共同祖先是commitC
。这是因为feature
现在包含了master
加上D'
和E'
(读作“D prime”和“E prime”)的新提交F
和E
,它们是应用于F
之上的提交。即使它们包含相同的更改,Git也会考虑
C' (feature)
B'
A'
* (master, origin/master)
*
*
| C (origin/feature)
| B
| A
|/
* some base commit
* (feature)
|\
C'|
B'|
A'|
* | (master, origin/master)
* |
* |
| C (origin/feature)
| B
| A
|/
* some base commit