如何在没有提交的情况下从git中的分支获取更改?

时间:2012-11-23 07:09:16

标签: git

我正在寻找一种不那么垃圾的方法:

git diff patch.DisableCreditCheck > ~/patch
patch -p1 < ~/patch

即。来自分支的更改作为原始未提交更改。

补丁的缺点是它不是很聪明;例如,我经常检测到“反转(或以前应用)的补丁!假设-R [n]?”当没有任何先前的补丁时,只会发生一组文件名,它会被混淆。

能够做到这一点 更好

git merge --no-commit --no-ff patch.DisableCreditCheck

...但是这会让你处于合并状态,没有明显的方法可以在保留更改的同时恢复正常状态。

帮助!这样做的任何体面的方式?

(当您在正在处理的代码上共享补丁时,这是非常有用的事情;比传递一组补丁文件要好得多)

编辑:作为我想要实现的一个例子,假设我们有两个分支,master和config.me。

当我做git diff config.me&gt; 〜/补丁; patch -p1&lt; 〜/补丁结果是:

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   Web/Web.config
#

这是期望的结果...但是没有使用补丁,这不能很好地工作(特别是在Windows上,它似乎非常难以检测应该完美合并的变化,但相反它会变得困惑并写出一堆of .orig和.rej文件)。

所以,就像我说的那样;我希望从没有提交的分支进行更改,作为本地未提交的更改

2 个答案:

答案 0 :(得分:1)

您的第一个示例显示您不希望特定分支的更改(即提交增量),而是您希望您的工作树反映最新状态 (在尝试选择正确的命令时可能导致混淆的细微差别。)

几种方式:

方法1:

$ git checkout patch.DisableCreditCheck .

这会使您的工作树镜像patch.DisableCreditCheckHEADpatch.DisableCreditCheck之间的更改会自动暂停。注意事项:它还会消除工作树中任何未提交的更改。 (注意:该句点(.)必须是工作树根目录的路径。)

方法2:

$ git read-tree patch.DisableCreditCheck

这会使您的索引成为镜像patch.DisableCreditCheck,但会保留您的工作树。

方法3:

$ git checkout --detached patch.DisableCreditCheck
$ git reset your-original-branch
$ git checkout -B your-original-branch

这是一个愚蠢的方法,与方法1 大致相同。它包含在学院中,因为它可能更容易理解。

答案 1 :(得分:0)

两种方式:

首先,如果您希望更改branchA但不希望它们在分支branchB中提交:

>> git checkout branchB
>> git cherry-pick -n ..branchA

这将获得“在B和A之间”发生的所有提交但不提交它们。 git status会显示一堆已更改的文件。

其次,如果您希望在新提交中进行更改,但不一定您做出的每次提交

>> git checkout branchA
>> git rebase -i branchB

这会将你的A分支B改为pick,但会让你选择squashgit help rebase的提交。压缩将基本上将几个提交折叠成一个更大的提交。有关挤压的详细信息,请参阅{{1}}。