2

我正在学习 git,我对一些命令问题感到困惑:

  1. 我创建了两个分支 A 和 B。在我的本地存储库中,A 已经存在。现在我想将 B 签出到同一个本地存储库中,并在 B 上操作而不干扰 A。那么我可以在没有 git -stash A 的情况下签出 B 吗?(刚才我只是直接输入checkout B,不用git -stash A,我觉得也可以。为什么?) git -stash 的作用是什么?

  2. 我一直对 git -merge 和 git -rebase 感到困惑。在什么情况下应该选择哪个?

4

3 回答 3

4

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
于 2013-05-16T06:31:24.257 回答
2

在英语中,“stash”的意思是“存放在某个地方”或“存放或安全保存以备将来使用”。这正是这样git stash做的。如果你正在做某事但不想提交它,因为它还没有完全完成,但需要处理其他紧急的事情,那就是你使用git stash. 存储您最近的更改并分支到您需要工作的新的紧急事情。有关 stash 含义的详细说明,请参阅ProGit book 中的这一章(6.3 Git Tools - Stashing)

简单地说,变基是指理顺你的工作历史的行为。要完全理解它的含义,您需要了解什么是分支以及什么是合并。所以我建议你阅读ProGit 书中关于分支的章节

于 2013-05-16T06:45:48.057 回答
2

git stash存储您未提交的更改。例如,您开始在分支 A 上开发功能,然后意识到您应该在分支 B 上工作,您会这样做

git stash
git checkout B
git stash pop

书中有一章是关于它

变基/合并几乎是一个见仁见智的问题。我经常喜欢变基。根据经验,您永远不应该对已经公开的任何内容进行 rebase,因为 rebase 会重写历史。

于 2013-05-16T06:21:12.140 回答