Git 合并2个分支而不删除文件
我已经从master创建了一个名为a的分支。在a分支上,我删除了一些文件,并对其他文件进行了一些更改。现在,我想在不删除文件的情况下将文件合并到主文件中。我怎样才能做到这一点呢?您可以使用Git 合并2个分支而不删除文件,git,github,Git,Github,我已经从master创建了一个名为a的分支。在a分支上,我删除了一些文件,并对其他文件进行了一些更改。现在,我想在不删除文件的情况下将文件合并到主文件中。我怎样才能做到这一点呢?您可以使用 git签出--。。。放弃工作目录中的更改 git add或git add.(用于当前目录中的所有更改)添加要提交的文件 git提交-m“您的消息” git push origin master将更改推送到master 你有很多选择。有些方法对于某些目的更好,而其他方法对于其他目的更好。我要猜哪一个是适合你的,
git签出--。。。放弃工作目录中的更改
git add
或git add.
(用于当前目录中的所有更改)添加要提交的文件git提交-m“您的消息”
git push origin master
将更改推送到master你有很多选择。有些方法对于某些目的更好,而其他方法对于其他目的更好。我要猜哪一个是适合你的,但是这是一个猜测。我将向您展示一些选项,但不是所有选项 记住Git是关于提交的,而不是文件。提交保存文件每个提交都有该提交中每个文件的完整快照,但Git是关于提交的 每个提交都有一个唯一的散列ID,这是一个由字母和数字组成的丑陋的大字符串。该散列ID表示提交。没有其他提交具有相同的字母和数字字符串。这些是Git关心的分支名称,如
master
或branch-A
,是为您而不是为Git而设。Git关心提交
一旦做出承诺,任何承诺都无法更改。每一个都被冻结了。当然,您可以将自己或其他人所做的提交提取到工作区,对工作区进行更改,然后告诉Git从工作区进行新的提交。事实上,这就是使用Git的方式
在使用Git的正常过程中,您可以从以下内容开始:
git checkout master
这告诉Git:获取提交,它的散列ID存储在我的名字master
下。记住,名字是给你的;Git关心散列ID。Git从提交中获取所有冻结的文件,将它们放在工作树的工作区中,现在您可以查看和使用这些文件,因为它们不再冻结在Git看不见的某些内部Git-only格式中
现在,您需要做一些工作,并git添加
一些文件等等,然后通常运行git提交
。现在是观察每个提交的另一个特性的时候了
每个提交都存储其父提交的原始哈希ID。因此,如果您刚刚提取了由master
标识的提交,那么该提交有一个父提交,它有另一个父提交,依此类推。如果我们画这些,我们会看到这样的东西:
... <-F <-G <-H <-- master
git show master:path/to/file
现在是棘手的部分!散列ID对于人类来说太难记住,所以为了帮助我们,Git将把I
的散列ID存储在某个名称下。它将使用的名称是我们为git checkout提供的名称。因此,Git将更新我们的主机
,以指向新的提交I
:
...--F--G--H
\
I <-- master
为了记住您给了git checkout
,git在您使用的名称上附加了一个特殊的名称,HEAD
(所有大写字母如下):
...--F--G--H <-- master, branch-A (HEAD)
现在,我不知道您在这个分支-A
分支上做了多少次提交。我马上画三张。但是在某个时候,你告诉Git:删除一些文件。因此,提交快照I
,或者J
或者K
,或者这三者都完全缺少一些文件:
假设您删除了提交J
中的文件,或者可能是I
中的文件。现在你想要他们回来。您当前正在提交K
,因为您仍然在分支-A
,这就是为什么您的头部仍然连接到分支-A
你首先要做的是再做一次新的承诺。它将得到一个新的hash ID,我们称之为L
(实际ID通常是一些丑陋的字母和数字字符串)。要进行这个新的提交,当您有K
时,一切都是干净的,因为它都已提交,所以git状态
显示“在branch-A上,无需提交”-您更改了工作区域以将文件放回
还要记住,每个提交都有其所有文件的完整快照。因此,我们将从commitH
获取文件,毕竟,它仍然与以前完全相同,所有提交都在时间上冻结了!我们只需要看看那些文件
有几种方法可以做到这一点。一种是使用git show
,如下所示:
... <-F <-G <-H <-- master
git show master:path/to/file
它显示保存在提交H
中的path/to/file
的内容,您的姓名master
在屏幕上指向该提交。当然,您不想看到它,而是想将它保存回path/to/file
。所以你可以这样做:
git show master:path/to/file > path/to/file
git add path/to/file
不过,git checkout
有一个奇怪的特性。它有一种模式,在这种模式下,它为我们这样做,而不实际切换提交和/或分支。所以我们可以写:
git checkout master -- path/to/file
这相当于git show
,因为它在我们的工作区中创建或替换文件,也相当于git add
,因为它像git add
一样更新索引
(我们没有讨论索引。索引,也称为暂存区,有时称为缓存,在Git中非常重要。但现在我没有时间把它放到这个答案中。)
无论如何,在对删除的所有不应删除的文件重复此操作后,现在可以运行git commit
创建新快照:
...--F--G--H <-- master
\
I--J--K--L <-- branch-A (HEAD)
I'
是我们的新版本I
,如果没有其他内容,可能会有不同的日期戳。(如果我们真的不需要更改任何东西,我们可以直接重复使用I
,Git会帮我们解决这个问题。)然后J'
是我们的J
副本,但是通过L
的更改,来放置文件
git show master:path/to/file > path/to/file
git add path/to/file
git checkout master -- path/to/file
...--F--G--H <-- master
\
I--J--K--L <-- branch-A (HEAD)
I'-J'-K' <-- HEAD
/
...--F--G--H <-- master
\
I--J--K--L <-- branch-A
git rebase -i master
...--F--G--H <-- master
\
I--J--K--L <-- branch-A (HEAD)
pick <hash-of-I> <subject-line-from-I>
pick <hash-of-J> <subject-line-from-J>
pick <hash-of-K> <subject-line-from-K>
pick <hash-of-L> <subject-line-from-L>
pick <hash-of-I> <subject-line-from-I>
pick <hash-of-J> <subject-line-from-J>
pick <hash-of-L> <subject-line-from-L>
pick <hash-of-K> <subject-line-from-K>
I'-J'-K' <-- HEAD
/
...--F--G--H <-- master
\
I--J--K--L <-- branch-A
I'-J'-K' <-- branch-A (HEAD)
/
...--F--G--H <-- master
\
I--J--K--L [abandoned]