创建仅用于合并的分支

时间:2013-05-14 22:55:42

标签: git merge branch

*这是其中之一“这是一个好主意吗?”问题,我无法真正格式化为SO可接受的问题,但....

我仍然对git不太满意,特别是与远程分支合并。如果出现问题或者我只是想放弃一堆合并冲突,我通常会努力回滚合并/提交。可以这么说,我发现自己离兔子洞越来越远了。我想知道,创建一个分支只是为了进行远程合并然后本地合并临时分支与我的“真正的”分支“会更容易吗?这样,如果出现问题,我总是可以将临时分支编入核心。” / p>

更新: 我特别感兴趣的是当我的远程分支机构将一堆文件添加到我的仓库时。例如(使用下面的Peter的例子):

我这样做:

$ git init
Initialized empty Git repository in /path/to/repo/.git/
$ touch README
$ git add README
$ git commit -m 'Initial commit'
[master (root-commit) da9886d] Initial commit
 0 files changed
 create mode 100644 README
$ touch A
$ git add A
$ git commit -m 'Add A'
[master 3480a5b] Add A
 0 files changed
 create mode 100644 A
$ git push // pushed to remote (only a single file, A)

然后另一位开发人员这样做:

$ git clone
$ touch B
$ git add B
$ git commit -m 'Add B'
[foo 9912a23] Add B
 0 files changed
 create mode 100644 B
$ git push // pushed to remote (now has two files A and B)

如果我这样做:

$ git pull

我将有两个文件A和B.现在如果我想“退后一步”并撤消合并:

$ git reset --hard master@{...}

文件B仍然作为未跟踪的文件存在于我的计算机上,对吧?我怎么能退后一步并删除这些文件,就像我从未进行过git合并一样?

这就是为什么我希望创建一个单独的分支。如果我创建一个单独的分支来进行合并:

$ git checkout -b tempBranchForMerge
$ git pull

我仍然以文件A和B结束,但它们只存在于tempBranchForMerge上。如果出现问题,我应该可以这样做:

$ git checkout master
$ git branch -d tempBranchForMerge

正确?这将删除文件B.

1 个答案:

答案 0 :(得分:2)

这绝对没问题,但没必要。

Git已经跟踪了您可以使用git reflog移动分支的位置的历史记录。我特别喜欢git reflog <branch name>

我们来试试吧。这里有一堆命令只是设置这个例子。我有一个master和一个foo分支。每个都有一个提交。然后我将foo合并到master

$ git init
Initialized empty Git repository in /path/to/repo/.git/
$ touch README
$ git add README
$ git commit -m 'Initial commit'
[master (root-commit) da9886d] Initial commit
 0 files changed
 create mode 100644 README
$ touch A
$ git add A
$ git commit -m 'Add A'
[master 3480a5b] Add A
 0 files changed
 create mode 100644 A
$ git checkout -b foo HEAD~1
Switched to a new branch 'foo'
$ touch B
$ git add B
$ git commit -m 'Add B'
[foo 9912a23] Add B
 0 files changed
 create mode 100644 B
$ git log --decorate --graph --all --pretty=oneline --abbrev-commit
* 9912a23 (HEAD, foo) Add B
| * 3480a5b (master) Add A
|/
* da9886d Initial commit
$ git checkout master
Switched to branch 'master'
$ git merge foo
Merge made by the 'recursive' strategy.
 0 files changed
 create mode 100644 B
$ git log --decorate --graph --all --pretty=oneline --abbrev-commit
*   d4d06ce (HEAD, master) Merge branch 'foo'
|\
| * 9912a23 (foo) Add B
* | 3480a5b Add A
|/
* da9886d Initial commit

现在让我们假设我想要撤消合并提交,即将master重新提交给提交之前的任何内容。

$ git reflog master
d4d06ce master@{0}: merge foo: Merge made by the 'recursive' strategy.
3480a5b master@{1}: commit: Add A
da9886d master@{2}: commit (initial): Initial commit
$ git reset --hard master@{1}
HEAD is now at 3480a5b Add A
$ git log --decorate --graph --all --pretty=oneline --abbrev-commit
* 9912a23 (foo) Add B
| * 3480a5b (HEAD, master) Add A
|/
* da9886d Initial commit