我正在寻找一种不那么垃圾的方法:
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文件)。
所以,就像我说的那样;我希望从没有提交的分支进行更改,作为本地未提交的更改。
答案 0 :(得分:1)
您的第一个示例显示您不希望特定分支的更改(即提交增量),而是您希望您的工作树反映最新状态那个分支的em> (在尝试选择正确的命令时可能导致混淆的细微差别。)
几种方式:
方法1:
$ git checkout patch.DisableCreditCheck .
这会使您的工作树镜像patch.DisableCreditCheck
。 HEAD
和patch.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
,但会让你选择squash
和git help rebase
的提交。压缩将基本上将几个提交折叠成一个更大的提交。有关挤压的详细信息,请参阅{{1}}。