zoukankan      html  css  js  c++  java
  • Git操作时遇到的一些问题和相应的处理方式

    Q1:如何解决冲突/避免冲突

    A1:执行git fetch之后,本地可能会存在冲突。

    如果希望合并本地修改内容,需要执行git merge。不过当有修改内容未提交时,不能merge,要么把修改内容提交,要么恢复修改。

    当执行git merge之后有冲突,并且不能自动合并,需要手工编辑文件解决冲突,再执行git add和git commit。可以利用git status查看冲突的文件名。用远程版本内容替换本地修改内容可以避免冲突(本地修改将被覆盖),

    1、对于未提交的修改: git checkout HEAD <path>

    2、对于已提交的修改:git reset --hard HEAD 还原至上一个提交

     

    Q2:如何撤销操作

    A2:(不适用于已经push成功)

    1、修复未提交文件中的错误

    如果工作区已经被改成一团乱麻,但是文件还未提交,可以通过以下方法撤销,让工作区回到上次提交时的状态。

    (1)git reset --hard HEAD

    重置工作区和暂存区,自从上次提交以来在工作区的任何修改都被丢弃。

    (2)git checkout HEAD <path>

    HEAD指向的分支中的全部或部分文件替换暂存区以及工作区的文件。不仅会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

    (3)git checkout --<path>

    用暂存区全部或指定的文件替换工作区的文件,清除工作区中未添加到暂存区的改动。

    2、修改已提交文件中的错误

    (1)修改旧提交

    如果刚刚做了某个提交(commit),但是马上又想修改这个提交,使用

    git commit --amend

    这个只能修改最近一次的提交,也就是用一个新的提交来覆盖上一次的提交。

    (2)撤销旧提交

    git revert HEAD

    要求工作区是干净的,与指定commit中的文件无冲突

     

    Q3:没有Change-Id,执行git push origin HEAD:refs/for/master之后,提示ERROR:missing Change-Id in commit message footer

    A3:错误原因:提交记录中缺少Change-Id。(Change-Id是通过钩子脚本自动生成的评审单号)

    解决办法:

    1、执行git pull --rebase,若与本地代码有冲突,请先解决冲突。

    2、执行git log查看自己的这次提交中是否有“Change-Id”这样的字符。如果已经存在,则直接执行第3步,否则在当前代码的根目录下执行:

    scp -p -P 29418 8位工号@gerrit.xxx.com.cn:hooks/commit-msg .git/hooks/

    然后再git commit --amend可以不修改任何东西,保存退出。这时git log 就可以看到Change-Id了。

    3、执行git push origin HEAD:refs/for/master 再次推送即可。

     

    Q4:评审单显示”Merge Conflict”

    A4:解决办法有三种:

    方法一 (推荐)

    1.本地执行git pull --rebase

    2.手动编辑冲突的文件,解决冲突

    3.git add 冲突的文件        

    4.git rebase --continue

    5.git push origin HEAD:refs/for/master

    注意:上面步骤中解决完冲突后,git add,git rebase --continue后就直接git push了,不要执行git commit。

    执行git pull --rebase 时,本地必须没有未commit 的代码。执行git status -uno可以看到修改但未提交的文件 ,根据需要可以commit,或者暂存,或者git checkout – 文件名 取消修改。然后再重新执行git pull --rebase 。

     

    方法二:

    适用于修改代码比较少时,备份自己的代码。

    1.登陆gerrit网页上,把该评审单点击"Abandon"废弃掉。

    2. git reset --hard  HEAD^^^^^^^   回退到自己提交之前的版本,建议多写几个^,一个^表示回退一次。

    3. git pull   更新代码,使其和库里一致。

    4.本地重新修改,提交新的评审。

    方法三:

    1.冲突时想用别人的代码覆盖本地代码

    git checkout --theirs <filename>

    2.冲突时想用本地代码覆盖别人的代码

    git checkout --ours <filename>

    3.冲突内容有交叉,想要一部分本地的,一部分别人的

    git checkout --merge <filename>

     

    Q5:评审不通过

    A5:分三种情景操作,详情如下:

    情景1.从提交了上次评审后,本地没做任何修改,也没更新过代码

    这种情况最简单,git log看到的最近一次提交,应该就是评审不通过的这次,这时按照评审意见修改代码,修改好了之后,执行如下命令

    git add

    git commit --amend    //一定要带着--amend

    git push origin HEAD:refs/for/自己分支名

    此时登陆gerrit上会看到原先自己评审不通过的评审单,状态已经更新,可以让评审员再次评审打分。

    情景2:从上次提交了评审后,本地代码更新过,但没有自己新修改的代码。

    此时git log看到的最近一次提交已经不是自己的了,这时需要git reset --hard回退到自己修改的那次提交,再修改。

    例如:

    git log看到如下记录:

    commit3 :12b5a45

    commit2: 8213017          //commit2这次提交是没有评审通过,需要修改的

    commit1: 941ba2b

    这时执行git reset --hard 8213017 就可以回退到自己的这次提交。

    此时再git log看到的是:

    commit2: 8213017          //commit2这次提交是没有评审通过,需要修改的

    commit1: 941ba2b

    此时再按照情景1的步骤操作。

    情景3:从上次提交评审后,本地做了新的修改,提交。

    此时需要把自己新修改的代码备份出来。

    然后按照情景2的方法进行操作。

     

    ------20191203闪

  • 相关阅读:
    ASP.NET AJAX Sys未定义的解决方法
    幽默中的人生哲理
    我们总是试图抹去一些东西,比如记忆。然而,一切只是徒然。
    在webbrowser中操作js弹出的对话框 以及触发其它事件····
    Asp.Net :写入 、读取 、 删除、追加cookie数组?
    揭开ASP.NET中Cookie编程的奥秘
    多线程调度例子·····················
    winform编程——做过ini配置文件创建文件、添加配置项,修改配置项,删除配置项
    C# 比较二个时间差。Environment.TickCount
     WebBrowser控件捕捉DHTML事件
  • 原文地址:https://www.cnblogs.com/bien94/p/11975073.html
Copyright © 2011-2022 走看看