我是 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 对这种情况没有任何作用。
提前致谢!
A -- B -- C
假设您的 master 位于 A,而您的修补程序位于 C。如果您
git merge hotfix
在 master 分支上,它会选择将 master 快进到 C,而不是创建新的提交。
所以你需要先强制git创建合并提交。
您可以在合并修补程序时添加
--no-ff
参数来强制创建合并提交。之后,分支将如下所示: /-- -- -- M <-master
/ /
A -- B -- C <-hotfix
...但文件仍会被删除。
您可以通过强制退出编辑器来修改合并提交。
所以你想修改你的合并提交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
你的假设是不正确的。当合并另一个不了解文件的分支时,一个分支中引入的文件不会被删除。合并合并会发生变化,并且不会覆盖它们。
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
(可能还包含以前存在的其他文件)。