git 命令最详细解析

克隆远程仓库:

git clone http://mgit-tm.rnd.zz.com/hap/screenrecorder -b Master_common_ct01

分支:

git branch //查看分支

git checkout dev  //切换到dev分支

git checkout -b dev //创建并切换到dev分支,dev分支是基于创建时分支而新建的分支,这样创建时,可以修改,可以push,但是pull更新代码会有问题,需要关联远程仓库

git branch --set-upstream-to=origin/Master_common_ct01 dev  //将dev分支关联到远程Master_common_ct01仓库,关联后可以使用git pull拉出代码

git checkout -b dev origin/Master_common_ct01  //创建并切换到dev分支,并将dev分支关联到远程Master_common_ct01仓库

git branch -d dev  //删除dev分支

git branch -D dev  //强制删除dev分支

分支合并:

git merge  //合并分支,如果当前分支是master,则将merge后面跟着的分支合并到当前分支,强烈不推荐使用,因为git merge会产生菱形提交效果,保留两个分支的所有提交信息,命令行看提交记录就是master和dev的提交记录交错进行的。merge了之后要分开参考:https://www.cnblogs.com/bescheiden/articles/10563651.html,注意,使用git revert -m 1 commmitID, 回退merge操作后代码是回到之前master分支合并之前的状态了,但是,commit信息还是合并之后的菱形的样式!!!!想要回到之前一模一样,还是git reset --hard  commitId,再强行git push -f。

提交:

git add <file> //添加修改文件

git add -A  //添加所有修改文件

git commit -m“commit message”  //提交修改信息

git push origin dev:refs/for/Master_common_ct01  //将dev修改commit推送到远程仓库

回滚:

git checkout .   此命令用来放弃掉所有还没有加入到缓存区(就是 git add 命令)的修改:内容修改与整个文件删除。但是此命令不会删除掉刚新建的文件。因为刚新建的文件还没已有加入到 git 的管理系统中。所以对于git是未知的。需要手动删除。而 -f 丢弃本地修改,还可以删除没有跟踪的

git checkout -f  //恢复本地所有未commit的修改。拉取分支代码,或者新建分支之后,做了一系列修改,全部都不想要,用此命令清理回退到刚同步代码或者刚拉出分支时的状态,只要是未commit的都会被清理。

git reset HEAD <filename>  //取消add、取消暂存。修改的代码还在,可以重新add

git reset commitID  //回退提交,即回退到未add之前,代码修改还在,tag点回退到指定commitID对应的位置,重新修改后再add、commit

git reset --hard commitID  //回退修改,代码、add、commit信息全部回退到commitID时的状态,修改的代码全部被删除。此时再运行git push -f  就会将远程分支回删到当前commitID点,更改远程是不可逆的,慎用,一般只有管理员权限才可以。

git revert commitID  // 回滚单个提交,如提交了commit1、commit2、commit3,其中commit2有问题,这个时候可以使用git revert commit2生成一个新的提交commit4,这个commit4就是将commit2删除。只能回滚单个提交,如果commit3修改过commit2,回滚也会出错,需要解冲突,最后push到远程,将远程的进行回滚

git 如何revert指定范围内的commit并且只生成一个新的commit?答:一共分成两步

一. revert多个commit并生成多个新的commit

  git revert <old commit>^..<new commit>

二. 使用rebase将多个新的commit合并成一个commit

  git rebase -i <base commit>

三.最后push到远程,远程新添加一个commit,这个commmit就是将之前的多笔提交回滚了

存档:

git stash  //存档当前的修改,如果是新增文件,需要先add再运行此命令进行存档,否则只能存修改的,新增的不会被存档

git stash save “save message”  //save message  是保存时的标记信息

git stash list  //查看存档文件列表

git stash pop  //使用最近一次存档到当前代码

git stash pop stash@{0}  //使用编号为0的存档到当前代码

git stash dorp stash@{0}  //删除编号为0的存档

git clear  //清空所有存档

注意:存档是放在公用区域,任意分支存档的,所有分支都可以使用,清理命令会清理所有的存档,慎用

追加提交:

git commit --amend 

1.已经add,未commit:需要追加修改,直接add进行追加,完成后commit,push,只生成一个gerrit

2.已经add,commit,未push生成gerrit:修改后add,再git commit --amend,进行追加,再push,只生成一个gerrit

3.已经add,commit,已经push生成gerrit,本地分支保留上次提交时的状态:在本地分支上继续修改,修改后add,再git commit --amend,查看amend之后的提交信息,如果信息中没有自动同步之前的ChangeID的话,就将生成的gerrit的ChangeID粘贴到信息的末尾,保存。再push,原来的gerrit会更新,gerrit地址保持不变

4已经add,commit,push生成了gerrit,本地仓库已经删除或被污染(如又修改了一个大需求,只修改到一半):采用挑单方式追加提交,本地新建并同步该分支最新代码,在原gerrit网址Download中复制Cherry-Pick,本地分支中粘贴复制内容并执行Cherry-Pick实现将修改应用到当前分支,再进行追加修改,修改后add,再git commit --amend,如果信息中没有自动同步之前的ChangeID的话,就将生成的gerrit的ChangeID粘贴到信息的末尾,保存。再push,原来的gerrit会更新为新修改后内容。

注意:本地多次修改并分别commit提交,最后push,结果是每次的commit最终都会生成一个对应的gerrit,且gerrit之间相互关联,因为每次提交都有对应的提交信息;本地commit一次,之后再都使用amend追加提交,修改信息,最后push只会生成一个gerrit,因为amend并没有新建提交信息,而是修改历史信息。追加提交的关键点在于ChangeID,如果ChangeID是一样的,系统就认为是同一次提交,是追加提交,只会更新之前ChangeID对应的gerrit;如果ChangeID不一样,就是新的提交,生成新的gerrit

挑单:

Cherry-Pick  //如dev中已经生成gerrit,现在需要挑单到dev2,在本地同步dev2最新代码,在原gerrit网址Download中复制Cherry-Pick,本地分支中粘贴复制内容并执行Cherry-Pick实现将修改应用到当前分支,再进行追加修改,修改后add,再git commit --amend,再push,原来的gerrit会更新为新修改后内容。在Cherry-Pick时,如果出现冲突,在代码中解冲突,冲突解完后再执行git cherry-pick --continue;再push,原来的gerrit会更新为新的修改。如果冲突太多,不想解了,采用git cherry-pick --abort中断,本地代码会回到执行执行Cherry-Pick之前的干净状态

同步远程仓库与修改提交:

1.本地未做修改,远程仓库有修改,git pull --rebase (不推荐使用git pull,容易生生菱形commit信息)

2.本地有修改,未add,使用git stash,存档本地修改,此时工作区干净,再使用git pull --rebase更新到最新代码;再git stash pop读取存档,解冲突,再上库

3.本地有修改,已add,已commit,未push生成gerrit,此时的工作区干净,使用git pull --rebase更新到最新代码,解冲突,git commit --amend追加提交信息,再push上库,生成一个gerrit

4.强制同步远程仓库,覆盖本地文件

    git fetch --all  //同步远程分支信息,但是代码不同步

    git reset --hard origin/Master_common_ct01  //关键是这个,强行将head移到origin/Master_common_ct01的最新处,冲掉本地所有修改,git fetch --all之后运行此命令,所有信息同步至最新;如果不运行git fetch,只能同步至代码刚拉下来时对应的分支最新信息

gerrit冲突:

1.gerrit过期,或其他gerrit已经抢先合入,导致当前gerrit不是基于最新远程库,在网站上点击rebase,使gerrit基于最新远程仓库更新

2.rebase无效还是显示冲突时,采用追加提交法解冲突追加提交更新gerrit,参见追加提交第4条

commit的增删改查:

当我们commit之后,总会遇到各种各样的情况,比如commit的信息的修改,commit内容的修改等等

git rebase -i  之后,就进入互交模式,会在vi编辑器中列举出来还未push到远程服务器的所有提交,列举的顺序是和git log列表的顺序相反的,在这个互交模式下,我们可以进行很多的操作:

如:我们commit了三次,本地有三笔提交,都未push过,git rebase -i

pick 提交一

pick 提交二

pick 提交三

1.希望将提交二删除。直接在vi编辑器中删除提交二的commit信息保存退出即可。

2.希望将提交三和提交二调换顺序。直接在vi编辑器中调换commit的顺序,保存退出即可。

3.希望将提交二和提交一合并。将提交二的pick修改为f(或者fixup),保存退出,提交二会被合并到前一个提交也就是提交一里面,提交信息为提交一的信息;将pick改为s(或者squash),保存退出,提交二会被合并到前一个提交也就是提交一里面,但是提交信息是提交一和提交二信息加在一起的信息。

4.希望将提交三和提交一合并。可以先将提交二和提交三交换,然后将提交三合并到提交一。

5.希望修改提交二的提交信息、或者希望在提交二上追加提交、或者希望将提交二分割成两个提交、或者希望在提交二和提交三之间插入新的提交。将提交二前面的pick修改为e(edit),保存退出,注意此时的head点就移动到提交二的位置了,提交三被保存起来;此时直接修改提交就是在提交二和提交三中间插入的新提交;此时也可以用git commit --amend 进行追加提交信息;也可以修改后git commit --amend追加修改然后;可以git reset 提交一,将指针移动到提交一,然后分步commit多次,这样就把提交二分割了;这些提交完成后,运行git rebase --continue 修改就会生效。

 其实运行git rebase -i 之后,就有很详细的说明:参照说明做即可

commands:
p, pick = use commit
r, reword = use commit, but edit the commit message
e, edit = use commit, but stop for amending
s, squash = use commit, but meld into previous commit
f, fixup = like "squash",but discard this commit's log message
d, drop = remove commit

These lines can be re-ordered; they are executed from top to bottom.
If you remove a line here THAT COMMIT WILL BE LOST.
However, if you remove everything, the rebase will be abort.
Note that empty commits are commented out

场景一:origin/master分支新建origin/develop分支,origin/master分支被其它人进行了提交commit1;自己提交了commit2到origin/develop分支,需要合并

先将origin/master merge到origin/develop,解决冲突,然后再将origin/develop合入到origin/master;

场景:origin/master分支新建origin/develop分支,origin/master分支被其它人进行了提交commit1;自己提交了commit2到origin/develop分支,上面场景一的合并指向杂乱,希望将origin/develop上的修改变基到origin/master的最新提交上去

由于origin/develop是远程分支很多人用,所以直接将origin/develop变基到origin/master上是非常危险的,所以这种操作不常用;使用替换方式更新

1、基于最新origin/master新建origin/develop2,本地同步出两develop和develop2;

2、git rebase develop2 develop;将develop以develop2为基础进行变基,变基后的develop代码为  “develop2+develop新增”,但是develop推送的话还是会推送到origin/develop,我们这里只是找不同,不要推送

3、git checkout develop2

4、git merge develop  ,将develop合入到develop2中,再push到origin/develop2,这样origin/develop2就相当于origin/develop基于origin/master进行变基的结果

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值