首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >git-藏和git-rebase的真正功能是什么?

git-藏和git-rebase的真正功能是什么?
EN

Stack Overflow用户
提问于 2013-05-16 06:18:48
回答 3查看 599关注 0票数 2

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

  1. 我在本地存储库中创建了两个分支A和B。现在我想将B签出到同一个本地存储库中,并在B中操作而不会干扰A,所以我可以在没有git -stash A的情况下检出B吗?(就在刚才,我刚刚直接输入结帐B,没有git -stash A,我认为它也可以works.Why吗?)git -stash的功能是什么?
  2. 我被git -merge和git -rebase混淆了。在哪种情况下我应该选择哪种情况?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-16 06:31:24

将未提交的更改保存起来,以便您可以在一段时间内处理其他内容。在过去,您通常提交更改、切换分支、返回,然后使用"git重置头^“来反转提交。

至于改版,以下是我的笔记:

类似于合并,但保持一个连续的线程。

简而言之,rebase获取当前分支并搜索它的历史记录,以查找它从指定分支分叉的点。然后,它将所有这些提交作为补丁并将它们应用到指定的分支,从而有效地将这些提交移植到指定分支的末尾。

在此之前:

代码语言:javascript
复制
     E--F--G        mybranch
    /
A--B--C--D          upstream

在“上游重新基地”之后:

代码语言:javascript
复制
           E'-F'-G' mybranch
          /
A--B--C--D          upstream

如果两个分支中都有提交(例如,因为您向某人发送了修补程序并将其应用),则它们不会被冗余地应用。见手册页。

注:这可能会搞乱任何已经有你的分支的副本的人。这个命令最好只在尚未被推送到另一个存储库的提交时使用。

上游可能是一个分支或任何其他有效的提交。

如果遇到冲突,则git将冲突标记(<<<<<)添加到受影响的文件中,并停止重基。解决冲突后,使用"git“。在处理所有冲突时,使用"git重基-继续“。您还可以使用"git rebase -abort“取消重基。

如果您在当前分支中有未实现的更改,则必须先将它们保存起来,然后再进行重基操作。

还允许您使用"-i“选项重写当前分支的历史记录(请参阅”重新排列提交“):

在此之前:

代码语言:javascript
复制
A--B--C--D--E

之后:

代码语言:javascript
复制
A--B--E'-C'-D'

甚至联合(壁球):

代码语言:javascript
复制
A--B--CE'-D'

或从链中完全删除提交:

代码语言:javascript
复制
A--B--D'-E'

onto:

--onto branch选项允许您将更改完全移植到不同的分支。例如,假设您的分支是从分支‘foo’中分叉的:

代码语言:javascript
复制
o--o--o--o--o  master
    \
     o--o--o--o--o  foo
                  \
                   o--o--o  mybranch

但现在你想从师父那里分叉:

代码语言:javascript
复制
o--o--o--o--o  master
    \        \
     \        o--o--o  mybranch
      \
       o--o--o--o--o  foo

您可以查看我的分支并发出以下命令:

代码语言:javascript
复制
git rebase --onto master foo

在英语中,这句话写着“从foo (但不包括)开始的所有更改,并将它们应用于master。”

请看手册页。-i也可以用于此。

注意:重基被认为是有害的:此命令通过有效重写历史来工作。可以将自己置于一种状态中,在这种状态下,不可能从过去的某个点重构存储库的状态。例如,在上面给出的第一个示例中,存储库状态E、F和G现在永远丢失。

好消息是,如果在进行重基之前为事物分配分支名称或标记,那么就不会真正丢失任何东西。如果我在重基之前执行了git branch foo,则分支"foo“将指向存储库的原始状态G,使其在以后可以恢复(直到删除分支foo)。

代码语言:javascript
复制
       E-F-G   foo
      /
     /     E'-F'-G' mybranch
    /     /
A--B--C--D          upstream
票数 4
EN

Stack Overflow用户

发布于 2013-05-16 06:21:12

git stash存储未提交的更改。例如,您开始在分支A上处理一个特性,然后意识到您应该在处理分支B,您可以这样做

代码语言:javascript
复制
git stash
git checkout B
git stash pop

这本书中有一个关于它的章节。

重新定位/合并基本上是一个意见问题。我通常更喜欢重新定位。作为一条经验法则,你永远不应该重新建立任何已经公开的基础,因为重基重写了历史。

票数 2
EN

Stack Overflow用户

发布于 2013-05-16 06:45:48

在英语中,“藏”的意思是“存放在哪里”或“存放或安全保管以备将来使用”。这正是git stash所做的。如果您正在处理某件事情,但不想提交它,因为它还没有完全完成,而是需要处理其他紧急事项,那就是您使用git stash的时候。把你最近的变化集中到你需要做的新的紧迫的事情上。有关存储意味着什么的详细说明,请参阅本章(6.3Git工具-存储)在ProGit书中

简单地说,重新定位指的是纠正你的工作历史的行为。要完全理解它意味着什么,您需要了解分支是什么以及合并意味着什么。所以我建议你读ProGit书中关于分支的章节

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16580280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档