如何将多个提交合并为一个,然后将它们分成两个或三个?

时间:2017-11-30 14:41:23

标签: git

在我的本地存储库中,我对代码进行了很多更改。在这样做时我拉了好几次,创建了不同的分支,多次提交,合并等等。然而,好处是我所做的一切,我只在当地做过。我从来没有推到远程存储库。所以,尽管我已经执行了git的所有复杂操作,但我仍然有一个非常简单的心理图:(1)远程存储库上有代码,(2)我有本地代码。现在,我想通过执行以下操作来清理所有内容:

  1. 我想看看远程和本地存储库上的代码之间有什么区别。
  2. 我想将我所拥有的所有更改打包,以便它们看起来像来自一次提交(带一条提交消息)。我不希望我到目前为止生成的所有提交消息都转到远程存储库。
  3. 我可能还想将我的更改拆分为两个或三个部分(每个部分作为单独的提交与相应的提交消息一起发布)。
  4. 可以用git做到吗?而且,如果是这样的话,我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

  1. git fetch --all && git diff master origin/master
  2. git checkout -b new-master && git branch -D master && git checkout master && git merge --squash new-master
  3. 与上述相同,但在回到主人之前,您应该使用git rebase -i重写为new-master
  4. 的历史记录

    1做的很简单:从远程存储库获取最新更改,并将您对本地更改进行比较。假设master是您要比较的分支。

    2更复杂。它会根据您的本地更改创建一个新分支,然后删除您的本地主数据(再次,假设这是您的工作分支)。之后,它会再次检出master,它会为您提供远程存储库主分支的副本。然后,git merge --squash结合new-master的所有更改并将其添加到master

    关于3.我建议你阅读git rebase

答案 1 :(得分:1)

假设您处于以下情况:

 o--o--o--o--o--o--o [remote branch]
        \        \  \
         o--o (... lots of commits ...) o--o [your branch]

要找出本地分支与远程分支之间的差异,请使用

$ git diff <your branch> <remote branch>

要创建一个或多个提交,在远程分支上应用您的工作,请执行以下操作:

  1. 在远程分支已指向的同一提交中创建并切换到新分支:

    $ git checkout -b <new branch> <remote branch>
    

    这导致:

     o--o--o--o--o--o--o [remote branch] [new branch]
            \        \  \
             o--o (... lots of commits ...) o--o [your branch]
    
  2. 将新分支和现有分支之间的差异复制到索引,准备新的提交:

    $ git checkout -p <your branch>
    

    满意后,创建一个提交:

    $ git commit
    

    导致:

                         o [new branch]
                        /
     o--o--o--o--o--o--o [remote branch]
            \        \  \
             o--o (... lots of commits ...) o--o [your branch]
    

    重复git checkout -pgit commit,直到新分支与现有本地分支之间没有更多差异:

                         o--o--o--o [new branch]
                        /
     o--o--o--o--o--o--o [remote branch]
            \        \  \
             o--o (... lots of commits ...) o--o [your branch]
    
  3. 将您的新分支推送到远程存储库,或发出拉取请求,或项目的任何工作流程。

答案 2 :(得分:0)

git rebase会帮助你。

要拆分最近的提交,请先:

$ git reset HEAD~

然后你可以提交你想要的不同部分。

对于加入不同的提交,您可以使用压缩找到要压缩的提交哈希,然后使用:

git reset *mentioned_hash*