我正在学习 git,我对一些命令问题感到困惑:
我创建了两个分支 A 和 B。在我的本地存储库中,A 已经存在。现在我想将 B 签出到同一个本地存储库中,并在 B 上操作而不干扰 A。那么我可以在没有 git -stash A 的情况下签出 B 吗?(刚才我只是直接输入checkout B,不用git -stash A,我觉得也可以。为什么?) git -stash 的作用是什么?
我一直对 git -merge 和 git -rebase 感到困惑。在什么情况下应该选择哪个?
我正在学习 git,我对一些命令问题感到困惑:
我创建了两个分支 A 和 B。在我的本地存储库中,A 已经存在。现在我想将 B 签出到同一个本地存储库中,并在 B 上操作而不干扰 A。那么我可以在没有 git -stash A 的情况下签出 B 吗?(刚才我只是直接输入checkout B,不用git -stash A,我觉得也可以。为什么?) git -stash 的作用是什么?
我一直对 git -merge 和 git -rebase 感到困惑。在什么情况下应该选择哪个?
Stash 只是将您未提交的更改隐藏起来,以便您可以在一段时间内处理其他事情。在过去,您曾经提交更改、切换分支、切换回,然后使用“git reset HEAD^”来撤销您的提交。
至于变基,这是我的笔记:
类似于合并,但保持单一线程的连续性。
简而言之,rebase 获取当前分支并在其历史记录中搜索它从指定分支分叉的点。然后它将所有这些提交作为补丁并将它们应用到指定的分支,有效地将这些提交移植到指定分支的末尾。
前:
E--F--G mybranch
/
A--B--C--D upstream
在“上游变基”之后:
E'-F'-G' mybranch
/
A--B--C--D upstream
如果两个分支中都有任何提交(例如,因为您向某人邮寄了一个补丁并且它已被应用),那么它们不会被冗余应用。请参见手册页。
注意:这可能会弄乱任何已经拥有您的分支副本的人。此命令最好仅用于尚未推送到另一个存储库的提交。
上游可能是一个分支或任何其他有效的提交。
如果遇到冲突,git 会在受影响的文件中添加冲突标记(<<<<<)并停止变基。解决冲突后,使用“git add file ”。处理完所有冲突后,使用“git rebase --continue”。你也可以使用“git rebase --abort”取消rebase
如果您在当前分支中有未提交的更改,则必须在执行 rebase 之前先存储它们。
还允许您使用“-i”选项重写当前分支的历史记录(请参阅“重新排列提交”):
前:
A--B--C--D--E
后:
A--B--E'-C'-D'
甚至组合(壁球)提交:
A--B--CE'-D'
或者完全从链中删除提交:
A--B--D'-E'
到:
该--onto branch
选项允许您将更改完全移植到不同的分支。例如,假设您的分支是从分支 'foo' 派生的:
o--o--o--o--o master
\
o--o--o--o--o foo
\
o--o--o mybranch
但是现在你希望它从 master 分叉出来:
o--o--o--o--o master
\ \
\ o--o--o mybranch
\
o--o--o--o--o foo
你会检查 mybranch 并给出这个命令:
git rebase --onto master foo
在英语中,这表示“接受自(但不包括)foo 以来的所有更改,并将它们应用于 master。”
--onto 也可用于从链中拼接出提交。请参阅手册页。-i 也可以用于此。
注意: rebase 被认为是有害的:这个命令通过有效地重写历史来工作。有可能将自己置于无法从过去某个时间点重建存储库状态的状态。例如,在上面给出的第一个示例中,存储库状态 E、F 和 G 现在永远丢失了。
好消息是,如果您在执行变基之前为事物分配分支名称或标签,那么什么都不会真正丢失。如果我git branch foo
在做 rebase 之前已经这样做了,分支“foo”会指向存储库的原始状态 G,使其稍后可以恢复(直到你删除分支 foo)。
E-F-G foo
/
/ E'-F'-G' mybranch
/ /
A--B--C--D upstream
在英语中,“stash”的意思是“存放在某个地方”或“存放或安全保存以备将来使用”。这正是这样git stash
做的。如果你正在做某事但不想提交它,因为它还没有完全完成,但需要处理其他紧急的事情,那就是你使用git stash
. 存储您最近的更改并分支到您需要工作的新的紧急事情。有关 stash 含义的详细说明,请参阅ProGit book 中的这一章(6.3 Git Tools - Stashing)。
简单地说,变基是指理顺你的工作历史的行为。要完全理解它的含义,您需要了解什么是分支以及什么是合并。所以我建议你阅读ProGit 书中关于分支的章节。
git stash
存储您未提交的更改。例如,您开始在分支 A 上开发功能,然后意识到您应该在分支 B 上工作,您会这样做
git stash
git checkout B
git stash pop
书中有一章是关于它的。
变基/合并几乎是一个见仁见智的问题。我经常喜欢变基。根据经验,您永远不应该对已经公开的任何内容进行 rebase,因为 rebase 会重写历史。