Git 合并而不删除当前分支中的文件

问题描述 投票:0回答:2

我是 git 新手,正在学习如何使用它将其集成到我的工作流程中。 目前,这是我的分支模型(基于此站点):https://nvie.com/posts/a-successful-git-branching-model/

两个常设分支机构: 代表当前生产分支的主分支。 一个开发分支,我认为它的名字很好听:-)

我使用hotfix分支来解决问题,hotfix是从master创建的。所以:我想修复修补程序分支上的错误,并将其合并到 master 和 dev 中,以便使用修复更新我的永久分支(Master 和 Dev)。

问题是:在 Dev 分支上,我创建了仅在该分支上的新文件(尚未在 master 上)。跟踪这些文件是因为在此分支上进行了提交以包含这些新文件。 当我将 Hotfix 合并到 dev 时,合并会删除 Dev 上不在 Hotfix 上的新文件...

所以我的问题:有没有一种方法可以在不删除 Dev 中尚未修复的文件的情况下进行合并?

git status
On branch hotfix
nothing to commit, working tree clean



git checkout dev
Switched to branch 'dev'
Your branch is behind 'origin/dev' by 2 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)


git merge hotfix
Updating b34835d..458a2cf
Fast-forward
  98 files changed, 1 insertion(+), 47534 deletions(-)


delete mode 100644 TG_anc/.htaccess
 delete mode 100644 TG_anc/Controleur.php
 delete mode 100644 TG_anc/Controleur/Controleur_Ajax.php
 delete mode 100644 TG_anc/Controleur/Controleur_Avertissements.php
 delete mode 100644 TG_anc/Controleur/Controleur_Commande.php
 delete mode 100644 TG_anc/Controleur/Controleur_Intervenants.php
 delete mode 100644 TG_anc/Model/Model.php

..等等,我所有未修复的文件都被删除。 如果我不进行快进合并,情况是一样的...... 也许我做错了什么?

我尝试将文件放入 .gitignore,ti 对这种情况没有任何作用。

提前致谢!

git merge
2个回答
0
投票
  1. 您的合并提交未创建,因为它是快进的。
A -- B -- C

假设您的 master 位于 A,而您的修补程序位于 C。如果您

git merge hotfix
在 master 分支上,它会选择将 master 快进到 C,而不是创建新的提交。

  1. 所以你需要先强制git创建合并提交。

    您可以在合并修补程序时添加

    --no-ff
    参数来强制创建合并提交。之后,分支将如下所示:

  /-- -- -- M  <-master
 /         /
A -- B -- C    <-hotfix

...但文件仍会被删除。

  1. 您可以通过强制退出编辑器来修改合并提交。

    所以你想修改你的合并提交M,而不是接受git的选择。要实现此目的,您可以崩溃退出合并编辑器 - 对于 vim,它是

    :cq

    如果异常退出编辑器,HEAD 将位于 A,但 B、C 的更改将被应用并暂存。

    所以你可以

    git reset
    然后
    git checkout
    它们,例如在你的情况下
    git reset TG_anc/ && git checkout TG_anc/

    之后您可以

    git merge --continue
    向 git 表明您已完成修改并愿意继续合并过程。

示例:

SHELL$ git init

SHELL$ touch ./a

SHELL$ git add ./a

SHELL$ git commit -m "A"
[master (root-commit) 63dd4c0] A
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a

SHELL$ git checkout -b hotfix
Switched to a new branch 'hotfix'

SHELL$ git rm a
rm 'a'

SHELL$ git commit -m "B"
[hotfix 105e68f] B
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 a

SHELL$ git checkout master  
Switched to branch 'master'

# Vim editor will show up after this, crash-exit by esc - :cq .
SHELL$ git merge hotfix  --no-ff
Removing a
hint: Waiting for your editor to close the file... error: There was a problem with the editor 'vi'.
Not committing merge; use 'git commit' to complete the merge.

SHELL$ git status
On branch master
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:
    deleted:    a

SHELL$ git reset -- a && git checkout -- a
Unstaged changes after reset:
D   a

SHELL$ git merge --continue
[master b769fdf] Merge branch 'hotfix'

SHELL$ git log --oneline --graph 
*   b769fdf (HEAD -> master) Merge branch 'hotfix'
|\  
| * 105e68f (hotfix) B
|/  
* 63dd4c0 A

SHELL$ ls
a

-1
投票

你的假设是不正确的。当合并另一个不了解文件的分支时,一个分支中引入的文件不会被删除。合并合并会发生变化,并且不会覆盖它们。

git checkout master
git branch hotfix
echo jska13 >file_only_on_master
git add file_only_on_master
git commit -m 'adding file to master'
git checkout hotfix
echo 'fix me' >fix
git add fix
git commit -m 'applied very import hotfix'
git checkout master
git merge hotfix

最后,您的主分支将包含文件

file_only_on_master
fix
(可能还包含以前存在的其他文件)。

© www.soinside.com 2019 - 2024. All rights reserved.