git 使用遇到问题及解决办法

1、代码提交流程

1) 本地修改代码后,执行以下命令:

    git status         //查看本地修改状态

    git add .          //这里只能暂存当前目录内所有修改的文件。如果路径是../../../******这类文件是无法用add ,添加到暂存区的

    git commit -m "JIRA: DAP-7008 修复storm升级配置问题"        //本地提交,标红部分与jira相关联

    git pull  --rebase  //可能代码冲突  如果冲突,本地解决冲突代码(intellij的changs页面可以直观看出冲突部分),再运行下面两步:1、git add .    2、git rebase --continue  

 (其中git add . 和git commit -m "********" 可以合并成一个命令:  git commit -am "*******")

2) git push origin HEAD:refs/for/develop          

     说明:推送代码到远端库,并发起review------------------------(push成功—》等待submit----结果merge或者merge conflict–>merge成功进入develop分支仓库,冲突停留。)

3)reviewer并打分,如果负分,如下图:

       

      代码提交人修改代码后,重新提交,命令如下:

      $ git add .

      $git commit --amend 

      $git push origin HEAD:refs/for/develop

3) 触发到develop-verify分支构建,查看本次提交的编译状态

4) submit前,确认提交develop-verify通过后方可submit,如下图:

   

5) submit

6)  触发develop分支构建

 

实例:遇到冲突的情况

A、别人的代码已经submit的情况。

1、git add .

2、git commit -m "***********"

3、git pull --rebase

(出现冲突,红色框提示冲突的文件。同时提示用户需要先解决这个冲突,然后用git rebase --continue继续)

4、本地intellij解决冲突(冲突前的代码,会同时存在你和远端的代码),可以git status查看你当前处在REBASE的分支下。

5、git add .

6、git rebase --continue

7、git push origin HEAD:refs/for/develop  

如果你直接是1,2,7三步提交到gerrit上,gerrit上就会出现如下提示冲突:merge conflict

使用第3、4、5、6、7步解决冲突以后,gerrit上的合并冲突字样就会消失,此时就可以submit了。

 

B、如果别人的代码和你一样都仅仅是push到gerrit上,还没有submit。此时,就看submit权限的童鞋优先提交哪一份了,剩下的那个代码即gerrit上提示冲突。同上解决方式。

2、放弃本地所有未commit的修改,得到干净的工作区

1)git status

 2)git clean -fd

3)git checkout .

3、放弃本地已经commit的修改

1)查找到需要回退点

2)git reset HEAD~3 --hard  #回退到19faf20

3)git log --pretty=oneline

4、目录太长解决办法

 git config --global core.longpaths true 

5、error: You have not concluded your merge (MERGE_HEAD exists) git拉取失败 

本地代码commit了,但无法push,发现git上现在不是最新版本,于是就想pull拉取最新版本

错误可能是因为在你以前pull下来的代码没有自动合并导致的.

有2个解决办法:

1.保留你本地的修改

git merge --abort

git reset --merge

合并后记得一定要提交这个本地的合并

然后在获取线上仓库

git pull

 

2.down下线上代码版本,抛弃本地的修改

不建议这样做,但是如果你本地修改不大,或者自己有一份备份留存,可以直接用线上最新版本覆盖到本地

git fetch --all

git reset --hard origin/master

git fetch

其中git fetch 只是下载远程的库的内容,不做任何的合并git reset 把HEAD指向刚刚下载的最新的版本

6、 网上git图解

7、  代码冲突问题复现以及解决过程:

7.1

问题复现

    git add 文件a
    git commit -m '提交信息注释'
    然后,再使用
    git pull--------------
    报错:Automatic merge failed; fix conflicts and then commit the result.
    意思是文件a自动合并到本地时,发生冲突(此时文件a已被更新),你需要修改被更新的文件a。

问题解决
打开本地文件a,可以看到文件a已经被更新(保留了服务器文件a的改动,同时也保存了本地的文件a的修改),此时,你需要修改文件a,合并冲突的代码。
然后
       git add 文件a
       git commmit -m '提交注释信息'
       git push
这时,服务器上的文件a,已经被替换成你push的文件a了。

7.2 git  checkout 命令使用方法
   1)恢复某个已修改的文件(撤销未提交的修改): checkout file-name

     例如:git checkout src/com/Android/.../xxx.Java

  2)比如修改的都是java文件,不必一个个撤销,可以使用: checkout *.java

  3) 撤销所有修改: checkout .

7.3 git  revert 命令使用方法

  撤销某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销
  作为一次最新的提交
    * git revert HEAD                  撤销前一次 commit
    * git revert HEAD^               撤销前前一次 commit
    * git revert commit-id (比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次提交进行保存。
  git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容

8、 强制放弃本地的所有修改内容,完全用远程版本develop来同步本地代码: 

 

         git reset --hard ORIGIN/develop

9.1、ERROR: missing Change-Id in commit message footer

解决方法:

git在每个人做过修改之后都要提交到远程的git服务器上,但是为了便于统一管理或者少出错,中间添加了一道审核程序(在本地和远程服务器之间还有一道“防火墙”),每次提交(commit)都需要产生一个id以便区分不同的提交,这个id的产生是使用一段脚本控制的:scp -p -P 29418 [email protected]:hooks/commit-msg ${gitdir}/hooks/。(注:脚本只是为了生成id,注意红色部分每个人不一样)

一定要在提交(commit)之间使用(运行)该脚本生成一个id,然后再次进行推送。如果已经提交(commit)了,就使用git reset HEAD~1,回退到上次提交之前,然后引入控制脚本(钩子)。

a、commit以后,push出错。git log查看没有Changer-Id(注意红色的脚本语句,后面要用到),注意右侧图最后一次提没有Chang-Id

b、git reset回退上一次commit提交到暂存区。

c、执行git push的时候的出错提示语句

d、再执行git commit,此时就有Change-Id了,就可以继续git push等

9.2、ERROR: missing Change-Id in commit message footer

还有一种经常发生的情况是:报了上述没有Change-Id的错误,但实际上,git log的时候是有Change-Id。

解决方法:1、执行git pull --rebase                                          -------------git pull --rebase表示把你的本地当前分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),                                                                                                                     然后 把本地当前分支更新为最新的"origin"分支,最后把保存的这些补丁应用到本地当前分支上

               2、 然后再执行git push origin HEAD:refs/for/develop

10、拉出另一个分支以后,同步合入

直接用gerrit页面操作,同步合入release分支,更方便一点。例如当前是develop分支,另一个分支是release/7.2.1

1、本地develop分支修改并提交以后,在gerrit页面Cherry Pick选择到release/7.2.1分支即可。

2、可以发现changs里面会裂变出另一个分支的提交记录。

 

利用上面的Cherry Pick到另一个分支,只能一个个commit的操作。如果是想将当前develop的分支所有内容一起merge到另一个分支。需要如下操作:

把远端release分支先checkout一下,再用git merge release/7.2.1。如果不checkout,则用全分支名称命令:git merge origin/release/7.2.1。对某些只需要合入release分支的需求,则必须checkout release分支的。

 

10.1、删除分支

git branch -D 分支名

11、git 提交不能提交空目录,如果maven编译打包涉及到必要的空目录,要注意可能会失败。

12、git 重命名文件名称时,仅仅修改大小写字母,无法提交成功。

原因:默认情况下,git大小写不敏感。修改方式如下,git命令执行下面命令:

git config --global core.ignorecase false

之后再用git config --list,查看一下core.ignorecase是不是已经被修改成false了。如果没有,可能是–global命令不行,去掉这个命令即可。

13、git stash的用法

适用场景:当前工作区内容已被修改,但是并未完成,还不能提交,但是bug单来了,需要优先解决。或者需要转到其他分支上进行一些工作。或者只是单纯的想git pull最新代码,也可以先存本地修改。

git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。

注意点:

1、git stash是将你当前的工作区和暂存区的修改都备份到栈中。

2、如果你需要一次从栈中获取累计的多次备份。

     用git stash list查看栈中记录。用git stash apply stash${index}回退出你需要的最近的index次备份。----------------也会存在冲突风险。

 

14、git pull的时候遇到  Unlink of file ‘.git/objects/pack/pack-***.pack‘ failed. Should I try again? (y/n) y

重新打开git命令窗口,运行一下命令:git gc --auto。然后再继续git pull即可

15、本地新增一些文件,push后又通过git reset HEAD~1 --hard 回退,本地文件也找不到的解决办法

通过git reflog找到原来提交的上一次提交的id,通过git reset id号  可以找回本地文件

15. 提交预览amend方法

git add .

git commit --amend

git push origin HEAD:refs/for/develop

16.拉新分支(目前测试,只有submit的权限有git push远端分支)

git checkout -b localbranchname

git push origin localbranchname:remotebranchname

另外:git push origin  :remotebranchname   ----(推送的时候,本地分支留空,就是删除远端分支意思)

17、不同分支之前merge

release/8.4.1   merge到develop

$git checkout release/8.4.1

$git pull

$git checkout develop

$git pull

$git merge release/8.4.1

#如果有冲突则通过手动解决

$git stash

$git pull

$git stash pop

#执行提交操作

 

18、git cherry-pick

当页面cherry-pick发生冲突时,如果手动cherry-pick?或者想同步合入另一个分支的多个commit?

$git reflog    ----查询需要同步的commit

$git checkout release/8.4.1   ----checkout到需要同步的分支

$git cherry-pick commitId     ----执行cherry-pick命令                 此处支持,多个间断的commitId(空格)以及连续的commitId(..)提交。

如果出现冲突,解决冲突,然后:

$git add .

$git cherry-pick --continue 

$git push origin HEAD:refs/for/release/8.4.1

 

 

你可能感兴趣的:(git使用)