2

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

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

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

patch 的缺点是它不是很聪明。例如,我经常得到“检测到反向(或以前应用的)补丁!假设 -R[n]?” 当没有任何以前的补丁时,只是碰巧有一组文件名会被它弄糊涂。

能够做到这一点会更好:

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

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

帮助!有什么体面的方法吗?

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

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

当我做 git diff config.me > ~/patch; patch -p1 < ~/patch 结果是:

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

这是理想的结果......但不使用补丁,它不能很好地工作(特别是在 Windows 上,它在检测应该完美合并的更改方面似乎非常糟糕,但相反它会感到困惑并写出一堆 .orig和 .rej 文件)。

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

4

2 回答 2

1

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

几种方式:

方法一:

$ git checkout patch.DisableCreditCheck .

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

方法二:

$ git read-tree patch.DisableCreditCheck

这会使您的索引变为 mirror patch.DisableCreditCheck,但保持工作树不变。

方法三:

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

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

于 2012-11-26T02:09:58.787 回答
0

两种方式:

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

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

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

其次,如果您想在新提交中进行更改,但不一定是您所做的每一次提交

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

这会将您的分支A重新设置为基础,B但会让您选择picksquash. Squashing 基本上会将几个提交折叠成一个更大的提交。有关git help rebase挤压的更多信息,请参阅。

于 2012-11-23T08:37:41.547 回答