Git 复习记录

log命令

git log –pretty=oneline //精简版显示log

git log –graph//显示合并分支图

git log –graph –pretty=oneline –abbrev-commit //显示精简版合并分支图

 

本地回退总结(工作区,stage区,commit后)

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout — file(checkout命令是用版本库文件替换工作区文件)。

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,直接回退一次命令git reset –hard HEAD^

场景4:已经提交了不合适的修改到版本库时,想要撤销本次提交,直接回退多次后发现回退过了,就需找到commit id回退到指定的commit,通过命令git log 找到想回退的commit id(电脑重启用git reflog), 再命令git reset –hard f80150a2c356768825f14e105e019eb1673d31d5

本地删除总结

场景1:工作区误删文件想找回,参考回退场景1,git checkout –file(checkout命令是用版本库文件替换工作区文件)

场景2:彻底删除,工作区删除文件后,命令git rm file(对比git add,都是把改动放到stage区),再提交这次改动(删除), 命令git commit -m “rm file”

branch常用命令

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

 

stash命令

git stash//添加stash

git stash list//查看stash

git stash apply//应用stash但并不删除stash

git stash drop//删除stash

git stash pop//应用stash且删除stash (=git stash apply + git stash drop+

tag命令

命令git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id;

git tag -a <tagname> -m “blablabla…”可以指定标签信息;

git tag -s <tagname> -m “blablabla…”可以用PGP签名标签;

命令git tag可以查看所有标签。

命令git push origin <tagname>可以推送一个本地标签;

命令git push origin –tags可以推送全部未推送过的本地标签;

命令git tag -d <tagname>可以删除一个本地标签;

命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

Merge

1.Fast forward 没分叉Merge

3.三方合并,两个分支都进行了改变,合并会把共有节点,Branch1改变,Branch2改变三方合并成一个新的commit

Rebase

假设有master分支,dev1分支,实际生产环境中master不断在变,dev1也不断在变,当合并dev1到master之前,应该先进行一次rebase,让dev1补上master的改变,详细的来说举个例子:
master提交了N次,Head向前N次commit(别的同事合并的),同时dev1提交一次,Head向前一次commit(我自己开发分支),现在我想合并代码到master了,在dev1分支这么搞

1.先执行命令 git rebase master

这个命令干了这些事儿:

  • 把dev1到和master共同节点之间的所有提交暂存起来,图中C4
  • 把master最新Head到和dev1共同节点之间的所有提交合并到Dev1(fast forward dev1合并相当于,因为dev1暂存了改变,是和master共同节点状态),图中C3
  • 把暂存的dev1提交接着fast forward合并到dev1,图中C4

2.切换到master分支,执行git merge dev1

这时候相当于dev1已经补全了master后来其他同事提交的代码,再合并

Rebase只是对dev1自己工作目录操作,不要尝试对公共分支使用