码迷,mamicode.com
首页 > 其他好文 > 详细

git使用总结

时间:2018-06-03 12:19:23      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:fetch   att   子模块   模块   操作   自动   ESS   cannot   对比   

以前只是简单git简单用法,并有远程merge权限,但现在由于没有merge权限,所以使用上存在一定问题。

问题1git push失败,显示有冲突,只能git pull产生冲突,自动merge会进行,产生新的提交,两次commit提交含有merge会被Leader否决。

改进方法。add之前,

  1. 有两种方法来把你的代码和远程仓库中的代码合并

    a. git pull这样就直接把你本地仓库中的代码进行更新但问题是可能会有冲突(conflicts),个人不推荐

    b. 先git fetch origin(把远程仓库中origin最新代码取回),再git merge origin/master(把本地代码和已取得的远程仓库最新代码合并),如果你的改动和远程仓库中最新代码有冲突,会提示,再去一个一个解决冲突,最后再从1开始

  2. 如果没有冲突,git push origin master,把你的改动推送到远程仓库中。

如果两个merge后,产生两个commit,然后pull是up-to-date状态,合并成一个的方法

git reset 前一个commit ID

git stash

git stash drop

丢弃

git reset 前一个commit ID

git stash

git pull

git stash pop

git add .

git commit -m ""

git push

问题2:提交时根本没有branch,提交失败。

 解决方法:repo sync后没有  repo start --all <branchname> #这一步不能漏掉,否则克隆的所有仓库默认处于no branch状态,容易导致后面工作时添加的代码丢失。

问题3:1个大项目,本地多个branch,且各自git提交在不同branch,尽管小的git成功提交和小的mm编译成功,但造成最后大项目整体编译会出现问题。编译是以branch进行的,尽管子模块git编译都没有问题,但整体编译时子模块不同branch造成各个Branch不是最新代码,所以失败。

解决办法:

方法一:暴力法,效果最好。1:新建branch,并将旧分支进行强制删除。,2:更新新建branch。repo sync,3repo start --all <branchname>,其中 branchname用新建branc名字。

方法二:解决各自Branc冲突,将代码stash后,重新拉取新代码,2:更新各个branch。repo sync,3repo start --all <branchname>,其中 branchname用希望编译的branch名字。

问题4:打补丁方式。

首先,打补丁命令git commit --amend --no-edit 。

打补丁建议不更新,直接打补丁。一旦更新,打补丁会出现问题。

 

问题5:git rebase使用(转自https://blog.csdn.net/TTKatrina/article/details/79288238)

使用git版本管理工具,必问git rebase的用法,但之前项目组人数5人,一直使用的是git pull,git commit 和git push,几乎没有用git rebase来变基,减少难看的merge 类型的commit。
最近一个新项目,两地合作办公大概有10人共用一个项目分支,几分钟内可能有多人提交,造成连续多个merge在gitk的路径中,看不清某个人某次有价值的提交是哪一条,故组长建议大家使用git rebase。

看了2015年多个博客,前人栽的树,整理如下,方便新人查看。


?merge和rebase解决冲突的差别图不贴了,主要是新使用的时候不知道写什么命令行。
命令行的使用直接上代码,git rebase 替代 git merge 大致过程:

git stash
git pull —rebase
git stash pop
手动解决冲突
git add -u
git rebase —continue
如果此时提示No rebase in progress?则表示已经没有冲突了;否则上面两步要重复多次
git commit -m “xxx”
git push origin [branch] -f
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

附录前人博客链接:
简单对比git pull和git pull –rebase的使用

[精华部分]使用下面的关系区别这两个操作:
git pull = git fetch + git merge
git pull –rebase = git fetch + git rebase

(附图解)git pull –rebase 做了什么? 以及 Cannot rebase: You have unstaged changes 解决办法

很喜欢如下图:
技术分享图片

git pull –rebase 理解
这个命令做了以下内容:
a.把你 commit 到本地仓库的内容,取出来放到暂存区(stash)(这时你的工作区是干净的)
b.然后从远端拉取代码到本地,由于工作区是干净的,所以不会有冲突
c.从暂存区把你之前提交的内容取出来,跟拉下来的代码合并
所以 rebase 在拉代码前要确保你本地工作区是干净的,如果你本地修改的内容没完全 commit 或者 stash,就会 rebase 失败。

还附上了git add -u的解释:

git add 的几种参数区别:
git add -A 保存所有的修改
git add . 保存新的添加和修改,但是不包括删除
git add -u 保存修改和删除,但是不包括新建文件。
如果只想提交某个文件,可以使用git add 路径/文件名 或者 git add 路径/

git rebase 使用详解

这一篇解释了手动解决冲突时<<<<和=====的含义
一般情况下rebase都是会有冲突的,详细查看冲突可以用命令git status然后就会显示哪个文件有冲突,然后打开有冲突的哪个文件,会发现有一些“<<<<<<<”, “=======”, “>>>>>>>” 这样的符号。

<<<<<<<” 表示冲突代码开始

“=======” 表示test与master冲突代码分隔符

“>>>>>>>" 表示冲突代码的结束

<<<<<<<  
所以这一块区域test的代码

=======  
这一块区域master的代码

>>>>>>> 

对于rebase的工作流以代码的形式也体现的很清楚:

git rebase 
while(存在冲突) {
    git status
    找到当前冲突文件,编辑解决冲突
    git add -u
    git rebase --continue
    if( git rebase --abort )
        break; 
}

除去替代merge,git rebase还有合并多个commit的功能,如下取自知乎:
(知乎)git rebase有哪些用法?
原文似乎不乐意被转载,简单记录如下,明细还是看原帖子。还没试验过,先记录如下:

两种经典用法
问题场景1.如何删除历史中某项提交?
【案例】去除提交列表中的某个commit,例如在master分支上A->B->C->D->E->F, 除去D。
方案一:
git checkout C //将HEAD切换到C提交
git cherry-pick master^ //master^即E,将E放在C后面,E的HSA1值改变
git cherry-pick master //master即F,将F放在E后面,F的HSA1值改变
git checkout master //将HEAD切换到master分支
git reset –hard HEAD@{1} //将HEAD切换到最新的F
方案二:
采用变基的方式
git rebase –onto C E^ F //前后开闭区间,E^即D,表面C后面加上(D,F]
git checkout master
git reset –hard HEAD@{1}
方案三:
交互式变基
git rebase -i D^
然后删除第一行(?没明白意思)

问题场景2.如何合并历史提交?
【案例】在master分支上A->B->C->D->E->F, 合并D到C,即A->B->CD->E->F。
方案一:
git checkout D
git reset –soft HEAD^^
git commit -c C//-c表示重用C的提交信息
git cherry-pick E
git cherry-pick F
git checkout master
git reset –hard HEAD@{1}
方案二:
用变基命令
git checkout D
git reset –soft HEAD^^
git commit -c C//-c表示重用C的提交信息
git tag newbase
git rebase –onto newbase E^ master
git tag -d newbase//清理该tag
方案三:交互式变基
git rebase -i C^
将第二行的pick更改为squash,二者将合并(?还是没明白意思)


 

git使用总结

标签:fetch   att   子模块   模块   操作   自动   ESS   cannot   对比   

原文地址:https://www.cnblogs.com/zhougong/p/9128303.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!