2

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

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

更新:我对我的远程分支何时将一堆文件添加到我的仓库特别感兴趣。例如(使用下面彼得的例子):

我这样做:

$ 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。

4

1 回答 1

2

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

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

让我们尝试一个例子。这里有一堆命令只是设置这个例子。我有一个master和一个foo分支。每个人都有一个提交。然后我合并foomaster.

$ 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
于 2013-05-14T23:16:02.700 回答