【问题标题】:How to take an old version of git code and make it the latest如何获取旧版本的 git 代码并使其成为最新版本
【发布时间】:2017-01-17 21:49:27
【问题描述】:

有人将非工作代码合并到 git 中,之后进行了几次签入。我有两个选择,1. 一个一个地还原更改,然后当我找到好的代码时,就停在那里。选项 2. 使用 checkin sha 分支出干净版本并使其成为 head。我看到问题posted here 和其他几个问题。如果我尝试选项一,当我尝试重置下一个选项时,我会在几次重置后得到:

On branch master
Your branch is ahead of 'origin/master' by 3 commits.
  (use "git push" to publish your local commits)
nothing to commit, working directory clean

然后我检查了我想要移动到 HEAD 的版本,并尝试提交它。但我明白了:

HEAD detached at 0c1b8c1
nothing to commit, working directory clean

当我尝试选项 2 时,获得了正确版本的代码,但是当我尝试提交时,它没有说明要提交。采用旧版本代码并使其成为 GIT 中最新最好的最好方法是什么?这就是我想要做的:

【问题讨论】:

    标签: git gitlab git-rebase git-reset git-revert


    【解决方案1】:

    这取决于你是否愿意

    1. 重写从Clean Code开始的历史记录(如果已经推送,则需要强制推送)或
    2. 附加历史记录只是消除错误提交的影响(推送友好)。

    1) 已描述
    2) 看起来像

    1 git checkout <CleanCode hash> 
    2 git symbolic-ref HEAD refs/heads/master
    3 git commit -m <commit message>
    4 git cherry-pick <good commit>
    
    1. 分离结帐,索引与 CleanCode 提交同步
    2. HEAD 再次指向主顶部,索引仍处于保持状态 CleanCode
      (1 和 2 可以替换为 get reset <CleanCode hash>git reset --soft &lt;master top hash&gt;
    3. 使用 CleanCode 中的有效索引进行新提交 - 原始 CleanCode 无效后每次提交的效果(坏和好)
    4. 应用良好的增量(良好提交的恢复效果)

    毕竟历史会是这样的

    <cherry-picked delta>
    |
    <CleanCode state copy>
    |
    <delta to cherry-pick>
    |
    <bad commit>
    ..
    |
    <CleanCode>
    |
    ..
    

    【讨论】:

      【解决方案2】:

      签出最后一个好的master到一个新的分支(所以如果你不小心在错误的时间推送我们不会破坏代码):

      git checkout <last good master hash> -b local_master_branch
      

      现在,您可以在该分支上挑选您想要的东西:

      git cherry-pick (HASH OF DESIRED COMMITS)
      

      这确实很好,但如果有很多分支,可能会很耗时。

      ======================================

      我的建议是检查 good 分支

      git checkout good_branch
      

      rebase 到 new_branch

      git rebase local_master_branch
      

      然后将其合并到本地 master

      git checkout local_master_branch
      git merge good_branch
      

      然后用 good 代码冲洗并重复。

      ====================================

      如果您的 good 分支实际上并不存在,而您只是有损坏的 master 可以使用,请检查一下

      git checkout origin/master -b broken_master
      

      并在好主人的基础上进行交互式变基

      git rebase -i local_master_branch
      

      这将允许您指定您实际想要保留的内容,并且实际上是三种方法中最快的。

      ++++++++++++++++++++++++++++++++++++++++++++++++++ +++

      那么! 危险!这里是龙!

      ++++++++++++++++++++++++++++++++++++++++++++++++++ +++

      完成后,您应该备份当前(损坏的)master

      git checkout origin/master -b broken_master
      

      然后检查您的干净、完全构建并且没有问题的分支,所有内容都已修复:

      git checkout local_master_branch
      

      重命名您的本地分支

      git branch -m master
      

      然后将其强制推送到 master

      git push origin master -f
      

      危险!如果您不知道自己实际在做什么,这是危险,因为您要在原点上重置主人。

      对于所有像“嘿,现在我正在研究的大师已经不存在了”的人,让他们重新建立在新大师的基础上。

      【讨论】:

      • 我创建了一个新分支,其中包含最后一个良好的签入 sha。现在,当我签出该分支时,我收到以下消息:git checkout origin/clean_branch Note: checking out 'origin/clean_branch'. You are in 'detached HEAD' state..... do so (now or later) by using -b with the checkout command again. Example: git checkout -b &lt;new-branch-name&gt; ========= Now if I do git rebase local_master_branch fatal: Needed a single revision invalid upstream local_master_branch'
      • 当您收到该消息时,请执行 git checkout -b new_branch_name 。您需要先命名分支,然后才能使用它。
      • 我进行了手动合并以获得我需要的内容。当您使用 -b 创建分支时,它将作为新分支推送。我想要的是推入 origin/master 或者换句话说我有一个分支 origin/clean_code 在 origin/master 后面并强制它到 origin/master
      猜你喜欢
      • 2017-05-18
      • 2011-09-14
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 2016-04-26
      • 2012-07-26
      • 1970-01-01
      • 2019-03-02
      相关资源
      最近更新 更多