【问题标题】:creating branch just for merge仅为合并创建分支
【发布时间】:2013-05-14 22:55:41
【问题描述】:

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

我仍然对 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。

【问题讨论】:

    标签: git merge branch


    【解决方案1】:

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

    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
    

    【讨论】:

    • 很好的例子。我要补充一点,如果我提前知道我可能会遇到一些棘手的事情,我会用git tag safepoint 标记我现在的位置,然后做任何我想做的事情。如果一切顺利,我可以git reset --hard safepoint。当然,当您还没有这样做时,了解 reflog 很重要。
    • 当您重置回 master@{1} 时,文件 B 会被删除,还是会存在但未被跟踪?我猜您的描述也适用于与远程分支合并。
    • 它将删除文件。 git reset --hard 会将分支指针移动到给定参数,并使工作树看起来像那时一样。除了--hard,还有其他选项。更详细的解释见git help reset
    猜你喜欢
    • 1970-01-01
    • 2020-04-18
    • 2017-10-11
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 2013-09-21
    • 2015-03-22
    • 1970-01-01
    相关资源
    最近更新 更多