Git:如何撤消本地提交和添加文件?

时间:2015-08-29 09:02:08

标签: git bitbucket

我错误地将文件添加到master并提交了。否则我必须在分支feature_x

中进行

现在我知道有git reset之类的命令。我的问题是,如果我重置了一些东西,它会撤消我的代码,还是只撤消文件并在master中提交?

如何在不丢失代码的情况下避免重置事项?

更新

代码还没有被推到远程。当我尝试它时给出了错误:

error: src refspec feature_x does not match any.

5 个答案:

答案 0 :(得分:8)

您当前在主分支上,意外提交X,Y和Z,如下所示:

A - B - C - X - Y - Z  <- master

现在您可以创建一个当前正在使用的新分支

git branch feature-x

feature-x分支将指向与master分支相同的提交,从而可以安全地将master分支重置为早期版本:

git reset --hard HEAD~3    # Move master branch 3 commits back

你现在有了这个

          X - Y - Z  <- feature-x
         /
A - B - C  <- master

现在您可以再次签出feature-x分支:

git checkout feature-x

答案 1 :(得分:0)

我通常使用:

git reset --soft HEAD^

如果我不确定我是否不想删除我的提交。

它会让你回到分期阶段。

答案 2 :(得分:0)

嗯,我不知道我头脑中的命令行方式,但大多数git客户端都有一个名为discard的按钮。在sourcetree中,这是你乐队的第3个按钮,这将丢弃任何本地更改,如果你已经提交更改,请将其还原。

答案 3 :(得分:0)

如果我已正确理解您,您已在master分支上提交了您不想要的master分支,但您仍希望保持不变。而不是在master上,您希望在分支feature_x上进行这些提交。我假设您在feature_x而不是master上的提交是master上的最后一次提交,因此您不希望在master之间保留提交。< / p>

重要的是要知道在git中,不是提交它的创建分支的内在属性。分支只是指向指向特定修订的指针(类似于标记),它(与标记不同)如果在该分支是签出分支时提交,则自动移动到新修订。

因此,

如果分支feature_x尚不存在

  1. 如果您有未提交的更改(已添加到索引或未添加到索引中),请暂时保留这些更改,并使用

    将其排除在外
    git stash
    
  2. 转到master分支

    git checkout master
    
  3. 创建指向与feature_x相同的提交的分支master

    git branch feature_x
    

    git checkout -b feature_x除外,这将保留master,而不是切换到新创建的feature_x

  4. 继续之前,请确保
    • 以上命令均未发生任何意外输出
    • master仍然是已签出的分支
  5. 现在,让我们将master分支移动到您希望master上的最后提交。

    如果这是bitbucket的master指向的提交,并且您的bitbucket存储库作为本地存储库中的远程origin(使用git remote -v查找),请执行以下操作:

    • 确保您的本地存储库有关遥控器的最新信息:

      git fetch
      
    • 将当前签出的分支(您的本地master分支)移动到远程master分支指向的提交:

      git reset --hard origin/master
      

    但是,如果在master之前您不想要提交,那么master上有一些您要保留master的提交,但尚未提交在您的bitbucket存储库上,从当地的当前master分支向后导航可能更容易。比如说,你希望master上的最后5次提交不存在,并且它们纯粹是线性的(它们之间没有合并),你可以

    git reset --hard master~5
    

    如果情况比那更复杂(例如,你不想在master上的历史部分中有合并),那么找出你最后一次提交的ID(sha1哈希)会更容易想借助图形工具掌握主人,然后将`master转移到那个

    git reset --hard <commit id>
    
    例如,如果提交ID为a1b2c3d4

    git reset --hard a1b2c3d4
    
  6. 如果分支feature_x已存在......

    ...并指向master

    的祖先

    按上述步骤进行,但在步骤1和2之间(即在您结帐master之前),请将feature_x转发至当前master

    git checkout feature_x
    git merge --ff-only master
    

    并跳过第3步(创建分支feature_x)。

    ...并且已提交不在master

    上的提交

    但是你希望feature_xmaster中的提交保持一致,那么你有几种可能性。

    最简单,最安全的方法是将提交从master合并到feature_x,再次在步骤1和2之间(即在您签出master之前):

    git checkout feature_x
    git merge master  # You might want to modify the suggested commit message,
                      # as 'merge master into feature_x' will be confusing when
                      # those commits won't be ancestors of 'master' later on.
    

    然后再从第2步开始,跳过步骤3.

    如果你想要feature_x上的线性历史记录,可以选择在feature_x的提交之上重新设置来自master的提交(所以就好像你已经在{{1}上提交了它们一样。 1}}以之后提交已经存在的那个开始)或者在feature_x的提交之上重新提交来自feature_x的提交(所以它就像提交一样以前在master上已经承诺master开始甚至之前已提交的提交。 如果线性历史不是必须的,我建议不要使用这两种选择,因为变基有点毛茸茸,需要非常好地理解git。无论如何,如果你追求其中一个,请确保你知道你在做什么(阅读你使用的命令的帮助页面)并且你做得对(确保你已经理解了这些帮助页面并尽量避免mistypings)。特别是在第一次(甚至更晚)重新定位时,可能需要对存储库进行本地克隆,以便在出现问题时进行备份。

答案 4 :(得分:-1)

如果您想从其他分支推送代码,则无需还原提交。

  • 只需拉出主分支并从主
  • 创建新分支
  • 之后推送您的分支并创建合并请求
  • 合并您的代码
  • 将主人拉到本地

它应该有用。