Git 合并2个分支而不删除文件

Git 合并2个分支而不删除文件,git,github,Git,Github,我已经从master创建了一个名为a的分支。在a分支上,我删除了一些文件,并对其他文件进行了一些更改。现在,我想在不删除文件的情况下将文件合并到主文件中。我怎样才能做到这一点呢?您可以使用 git签出--。。。放弃工作目录中的更改 git add或git add.(用于当前目录中的所有更改)添加要提交的文件 git提交-m“您的消息” git push origin master将更改推送到master 你有很多选择。有些方法对于某些目的更好,而其他方法对于其他目的更好。我要猜哪一个是适合你的,

我已经从master创建了一个名为a的分支。在a分支上,我删除了一些文件,并对其他文件进行了一些更改。现在,我想在不删除文件的情况下将文件合并到主文件中。我怎样才能做到这一点呢?

您可以使用

  • 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上,无需提交”-您更改了工作区域以将文件放回

    还要记住,每个提交都有其所有文件的完整快照。因此,我们将从commit
    H
    获取文件,毕竟,它仍然与以前完全相同,所有提交都在时间上冻结了!我们只需要看看那些文件

    有几种方法可以做到这一点。一种是使用
    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]