git rebase,跟踪“本地”和“远程”
在做git rebase时,在解决冲突时,我经常很难弄清楚'local'和'remote'发生了什么。 我有时会产生这样的印象:他们从一个承诺转到另一个承诺。
这可能(绝对),因为我还没有正确理解。
当重组时,谁是'本地'和谁是'偏远'?
(我使用P4Merge来解决冲突)
TL; DR;
总结(如Benubird评论),当:
git checkout A
git rebase B # rebase A on top of B
local
是B
(rebase 到 ), remote
是A
和:
git checkout A
git merge B # merge B into A
local
是A
(合并成 ) remote
是B
rebase切换ours
(rebase开始前的当前分支)和theirs
( theirs
想要rebase顶部的分支)。
kutschkem指出, 在GUI mergetool上下文中 :
ours
”(上游分支) theirs
” - 当前分支之前的变形。 请参阅本答复最后部分的插图。
反转时,反转
这种混淆可能与ours
和theirs
在反弹过程中的倒置有关。
(相关摘录)
git rebase
手册页:
请注意,通过在<upstream>
分支顶部重播来自工作分支的每个提交,合并索引合并工作。
因此,发生合并冲突时:
ours
”的一面是迄今为止重新发布的系列文章,从<upstream>
, theirs
'是工作分支。 换句话说,双方交换。 说明倒置
在合并
x--x--x--x--x(*) <- current branch B ('*'=HEAD)
--y--y--y <- other branch to merge
,我们不改变当前分支'B',所以我们仍然在做我们正在做的事(我们从另一个分支合并)
x--x--x--x--x---------o(*) MERGE, still on branch B
^ /
ours /
/
--y--y--y--/
^
their
在rebase上:
但是在一个rebase上 ,我们转换方,因为rebase做的第一件事是检查上游分支! (重播当前的提交)
x--x--x--x--x(*) <- current branch B
--y--y--y <- upstream branch
git rebase upstream
的git rebase upstream
会首先将B的HEAD
更改为上游分支HEAD
(因此与之前的“当前”工作分支相比,“我们”和“他们的”开关)。
x--x--x--x--x <- former "current" branch, new "theirs"
--y--y--y(*) <- upstream branch with B reset on it,
new "ours", to replay x's on it
,然后rebase会在新的'我们的'B分支上重播'他们'的提交:
x--x..x..x..x <- old "theirs" commits, now "ghosts", available through reflogs
--y--y--y--x'--x'--x'(*) <- branch B with HEAD updated ("ours")
^
|
upstream branch
注意:“上游”概念是从中读取数据或添加/创建新数据的参考数据集(全部回购或像这里的分支,可以是本地分支)。
' local
'和' remote
'与' mine
'和' theirs
'
Pandawood在评论中补充道:
对我而言,问题仍然存在,这是“本地”,谁是“远程”(因为在git中重新绑定时不会使用“我们”和“他们的”这些术语,这些术语似乎使答案更加混乱) 。
GUI git mergetool
kutschkem补充道,正确如此:
在解决冲突时,git会说这样的话:
local: modified file and remote: modified file.
我很确定这个问题是针对当地和偏远地区的定义。 那时,从我的经验来看,我认为:
ours
”(上游分支) theirs
” - 当前分支之前的变形。 git mergetool
确实提到了“本地”和“远程” :
Merging:
f.txt
Normal merge conflict for 'f.txt':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (kdiff3):
例如,KDiff3会显示合并分辨率,如下所示:
并且融合也会显示它:
VimDiff相同,它显示:
用git mergetool -t gvimdiff调用Vimdiff作为mergetool。 最新版本的Git使用以下窗口布局调用Vimdiff:
+--------------------------------+
| LOCAL | BASE | REMOTE |
+--------------------------------+
| MERGED |
+--------------------------------+
LOCAL
: 包含当前分支上文件内容的临时文件。
BASE
: 包含合并的公共基础的临时文件。
REMOTE
: 包含要合并的文件内容的临时文件。
MERGED
: 包含冲突标记的文件。
Git已经执行了尽可能多的自动冲突解决方案,并且此文件的状态是LOCAL
和REMOTE
的组合,其中包含任何Git无法解析的冲突标记。
mergetool
应将解析结果写入此文件。
底线
git rebase
混帐合并
换句话说, LOCAL总是原创的,而REMOTE总是那些之前没有提交过的人,因为他们被合并或重组在上面
证明给我看!
当然。 不要听我的话! 这是一个简单的实验,你可以自己看看。
首先,确保你已经正确配置了git mergetool。 (如果你没有,那么你可能不会读这个问题。)然后找到一个工作目录。
设置您的存储库:
md LocalRemoteTest
cd LocalRemoteTest
创建一个初始提交(使用空文件):
git init
notepad file.txt (use the text editor of your choice)
(save the file as an empty file)
git add -A
git commit -m "Initial commit."
在不是主控的分支上创建提交:
git checkout -b notmaster
notepad file.txt
(add the text: notmaster)
(save and exit)
git commit -a -m "Add notmaster text."
在主分支上创建一个提交:
git checkout master
notepad file.txt
(add the text: master)
(save and exit)
git commit -a -m "Add master text."
gitk --all
此时你的仓库应该是这样的:
现在进行rebase测试:
git checkout notmaster
git rebase master
(you'll get a conflict message)
git mergetool
LOCAL: master
REMOTE: notmaster
现在是合并测试。 关闭您的mergetool而不保存任何更改,然后取消rebase:
git rebase --abort
然后:
git checkout master
git merge notmaster
git mergetool
LOCAL: master
REMOTE: notmaster
git reset --hard (cancels the merge)
您的结果应该与顶部显示的结果相同。
我没有完全确定您的问题,但我认为下图解决了您的问题。 (Rebase:远程仓库--->工作区)
来源:我的Git工作流程
链接地址: http://www.djcxy.com/p/41677.html上一篇: git rebase, keeping track of 'local' and 'remote'
下一篇: How to prevent vim from creating (and leaving) temporary files?