gpt4 book ai didi

git : Move staged changes to different or new branch

转载 作者:行者123 更新时间:2023-12-03 15:08:40 26 4
gpt4 key购买 nike

我目前可以通过以下三个步骤来完成

  • 使用 git reset HEAD <file>... 取消暂存
  • 结帐到分行 git checkout [-b] <branchname>
  • 再次登台git add <file>...

  • 有没有更好的方法来移动分阶段的更改?

    最佳答案

    Edmundo's answer是正确的,但它可以使用一些关于为什么它是正确的细节。

    这里有两个有趣的案例:

  • 创建一个从您现在所在的提交开始的新分支非常简单:
    $ git checkout -b newbranch
    ... continue working; git add and/or git commit as usual ...
    git checkout -b只要新分支本身没问题(具有不与现有名称冲突的有效名称),步骤就永远不会失败。
  • 转移到其他一些已经存在的分支可能非常容易:
    $ git checkout otherbranch
    ... continue working ...

    如果失败,您将希望/需要至少进行一次提交。

    您可以将此提交作为普通提交,然后将其复制到新分支并从当前分支中删除;或者您可以使用 git stash ,这实际上做了两次提交。1 只是这两次提交不在任何分支上,这使得 git stash apply 更加明显。可以在任何地方重新应用这些提交。 (使用 git stash pop 只是在说 git stash apply && git stash drop ,即应用,然后,如果 Git 认为一切顺利——不管它是否真的进展顺利——放下 stash 。我建议将两者分开,这样你就可以检查它是否进展顺利,虽然通常会这样,但最终这通常是很小的。)


  • 1这两个提交是为了在工作树中保存 (a) 索引/暂存区,以及 (b) 相应的文件(即所有跟踪的文件)。如果您使用 git stash save --untrackedgit stash save --all ,它实际上进行了三个提交。您可能不想要三提交表单,这非常棘手。

    这是怎么回事

    进行更改后,这些更改将存储在文件中。这些文件出现在两个位置之一或两个位置:
  • 您的工作树,这是您拥有普通文件格式的文件的地方,以便您可以使用它们(因此名称为“工作树”);或
  • 你的暂存区,Git 也称之为索引。

  • 索引或暂存区是您构建下一次提交的地方。通常,它已经包含了——它开始于——来自当前提交的所有文件,它们在当前提交中的形式相同(顺便说一下,它总是被称为 HEAD )。也就是说,你运行:
    git checkout <branch-name-or-commit-hash-or-similar>

    并且您的工作树和您的索引/暂存区都被填充,以便它们与您刚刚 check out 的提交相匹配,现在称为 HEAD . (如果您 check out 分支名称,则您 check out 的提交是该分支上的最新或提示提交。)例如,假设您执行了 git checkout master .

    如果此时不触及索引和工作树,显然可以 git checkout任何其他提交,例如, git checkout develop . Git 可以丢弃索引和工作树中的版本,因为它们与您 check out 的提交相匹配。如果它抛出一个 README文件,甚至是整个工作文件集,那又怎样?他们仍然在另一个提交中,即 master 的提示提交中.您只需 git checkout master当你想要他们回来时再次。

    但这不是你在这里关心的情况。在这里,您修改了一些文件。你甚至可能运行过 git add为下一次提交暂存。但所有 git add README做的是将文件从工作树复制到索引中。这意味着 README 的索引和工作树版本相互匹配。它们都不匹配 HEAD (当前)提交。

    假设 HEADdevelop的提示你应该在 feature反而。您想 git checkout feature .但是 README会发生什么? ?你做出了改变。您甚至可以暂存它,将其复制到索引中。

    好吧,事实是,Git 很懒惰。如果您现在运行 git checkout feature移动 HEAD提交到分支顶端 feature ,Git 将不得不做一些工作。这可能包括删除当前的 README文件并将其替换为 feature 提示中的文件.

    但也许——只是也许—— feature 的提示提交有相同的 README文件作为 develop 的提示提交.如果是这样,Git 可能很懒惰! Git 根本不会费心撕掉现有的 README来自索引/暂存区和/或工作树。它可以保留修改后的 README无论现在在哪里。而这正是 Git 所做的。

    如果 Git 不能对文件偷懒,它会检查。如果您的索引和/或工作树中的文件与 HEAD 中的文件不匹配提交你正试图离开,然后 git checkout feature失败。 (参见 the git read-tree documentation 及其列表——哎呀!—— 21 possible cases for a "two tree merge" ,以准确查看哪些成功,哪些失败。不过,大多数情况下,您不必关心所有这些:如果成功,您就'很好,如果失败,你必须提交或 stash 。)

    这就是为什么 git checkout -b newbranch总是成功:它使用指向当前( HEAD )提交的分支名称创建新分支。然后它从 HEAD 切换 promise ......好吧,它本身。没有什么可以切换的。懒惰步骤适用于每个文件:没有文件必须被改变,所以没有文件被改变,所以 git checkout -b只是工作。

    而且,这就是为什么 git checkout -b otherbranch有时会成功:它需要从 HEAD 切换提交 otherbranch的提示.如果该提交有一些不同的文件,Git 将不得不立即删除索引/暂存区和工作树中的文件,并将它们替换为 otherbranch 提示中的版本。 .仅当索引/暂存区和工作树中的版本现在与 HEAD 中的版本匹配时才允许这样做。犯罪。

    关于git : Move staged changes to different or new branch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44162174/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com