git log
查看 提交历史默认不用任何参数的话,git log
会按提交时间列出全部的更新,最近的更新排在最上面javascript
经常使用 -p
选项展开显示每次提交的内容差别,用 -2
则仅显示最近的两次更新;java
仅显示简要的增改行数统计git
git checkout .
#本地全部修改的。没有的提交的,都返回到原来的状态
git stash
#把全部没有提交的修改暂存到stash里面。可用git stash pop回复。
git reset --hard HASH
#返回到某个节点,不保留修改。
git reset --soft HASH
#返回到某个节点。保留修改
web
某个节点是哪一个节点?shell
指某次提交的版本ID,通常输入前几位便可。查看某次提交的版本ID能够经过git log 的方法,也能够api
经过git reflog来查看,git reflog 能够查看全部分支的全部操做记录(包括(包括commit和reset的操做),bash
包括已经被删除的commit记录,git log则不能察看已经删除了的commit记录。app
--hard 是本地代码,index,commmit都回退学习
--soft是代码保留,index保留,commit回退,能够随时提交;fetch
--mixed是代码保留,index 和commit回退。
对于已经push的代码,回退本地代码其实也想同时回退线上代码,回滚到某个指定的版本,线上,线下代码保持一致就要用到git revert.
revert 使用,须要先找到你想回滚版本惟一的commit标识代码,能够用 git log 或者在adgit搭建的web环境历史提交记录里查看.
git revert c011eb3c20ba6fb38cc94fe5a8dda366a3990c61
一般,前几位便可
git revert c011eb3
git revert是用一次新的commit来回滚以前的commit,git reset是直接删除指定的commit
看似达到的效果是同样的,其实彻底不一样.
第一:
上面咱们说的若是你已经push到线上代码库, reset 删除指定commit之后,git push可能致使一大堆冲突.可是revert 并不会.
第二:
若是在往后现有分支和历史分支须要合并的时候,reset 恢复部分的代码依然会出如今历史分支里.可是revert 方向提交的commit 并不会出如今历史分支里.
第三:
reset 是在正常的commit历史中,删除了指定的commit,这时 HEAD 是向后移动了,而 revert 是在正常的commit历史中再commit一次,只不过是反向提交,他的 HEAD 是一直向前的.
7.1 比较工做区与暂存区
git diff 不加参数即默认比较工做区与暂存区
7.2 比较暂存区与最新本地版本库(本地库中最近一次commit的内容)
git diff --cached [<path>...]
7.3 比较工做区与最新本地版本库
git diff HEAD [<path>...] 若是HEAD指向的是master分支,那么HEAD还能够换成master
7.4 比较工做区与指定commit-id的差别
git diff commit-id [<path>...]
7.5 比较暂存区与指定commit-id的差别
git diff --cached [<commit-id>] [<path>...]
7.6 比较两个commit-id之间的差别
git diff [<commit-id>] [<commit-id>]
7.7 使用git diff打补丁
git diff > patch //patch的命名是随意的,不加其余参数时做用是当咱们但愿将咱们本仓库工做区的修改拷贝一份到其余机器上使用,可是修改的文件比较多,拷贝量比较大,
此时咱们能够将修改的代码作成补丁,以后在其余机器上对应目录下使用 git apply patch 将补丁打上便可
git diff --cached > patch //是将咱们暂存区与版本库的差别作成补丁
git diff --HEAD > patch //是将工做区与版本库的差别作成补丁
git diff Testfile > patch//将单个文件作成一个单独的补丁
拓展:git apply patch 应用补丁,应用补丁以前咱们能够先检验一下补丁可否应用,git apply --check patch 若是没有任何输出,那么表示能够顺利接受这个补丁
另外可使用git apply --reject patch将能打的补丁先打上,有冲突的会生成.rej文件,此时能够找到这些文件进行手动打补丁
学习无他法,惟有锲而不舍
$ git fetch <远程主机名>
要更新全部分支,命令能够简写为:
$ git fetch
上面命令将某个远程主机的更新,所有取回本地。默认状况下,git fetch
取回全部分支的更新。若是只想取回特定分支的更新,能够指定分支名,以下所示 -
$ git fetch <远程主机名> <分支名>
好比,取回origin
主机的master
分支。
$ git fetch origin master
所取回的更新,在本地主机上要用”远程主机名/分支名”的形式读取。好比origin
主机的master
分支,就能够用origin/master
读取。
取回远程主机的更新之后,能够在它的基础上,使用git checkout命令建立一个新的分支。
$ git checkout -b newBrach origin/master
上面命令表示,在origin/master
的基础上,建立一个新分支:newBrach。
此外,也可使用git merge
命令或者git rebase
命令,在本地分支上合并远程分支。
$ git merge origin/master # 或者 $ git rebase origin/master
上面命令表示在当前分支上,合并origin/master
。
暂时理解不了,之后再说。
1)使用git log -g 找回以前提交的commit
2)使用git branch [新分支] commit_id 建立一个分支
3)切换到新分支,检查文件是否存在
git remote show
命令加上主机名,能够查看该主机的详细信息。
$ git remote show <主机名>
git remote add
命令用于添加远程主机。
$ git remote add <主机名> <网址>
git remote rm
命令用于删除远程主机。
$ git remote rm <主机名>
git remote rename
命令用于远程主机的更名。
$ git remote rename <原主机名> <新主机名>
12.git stash
一、恢复改动。若是你要恢复的是最近的一次改动,git stash pop便可。若是有屡次stash操做,那就经过git stash list查看stash列表,从中选择你想要pop的stash,运行命令git stash pop stash@{id}或者 git stash apply stash@{id}便可。
二、删除stash。git stash drop <stash@{id}> 若是不加stash编号,默认的就是删除最新的,也就是编号为0的那个,加编号就是删除指定编号的stash。git stash clear 是清除全部stash,整个世界一会儿清净了!
三、git stash pop 与 git stash apply <stash@{id}> 的区别。
git stash pop stash@{id}命令会在执行后将对应的stash id 从stash list里删除,而 git stash apply stash@{id} 命令则会继续保存stash id。
14.git rebase
此图是git merge 的结果。
这是git rebase的结果。“mywork"分支历史看起来像没有通过任何合并同样。
$ git checkout mywork
$ git rebase origin
这些命令会把你的"mywork"分支里的每一个提交(commit)取消掉,而且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),而后把"mywork"分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到"mywork"分支上。
当'mywork'分支更新以后,它会指向这些新建立的提交(commit),而那些老的提交会被丢弃。 若是运行垃圾收集命令(pruning garbage collection), 这些被丢弃的提交就会删除.
在应用的补丁的过程当中可能会遇到冲突,解决冲突的办法是:
$ git rebase --continue
这样git会继续应用(apply)余下的补丁。
在任什么时候候,你能够用--abort参数来终止rebase的行动,而且"mywork" 分支会回到rebase开始前的状态。
$ git rebase --abort
git rebase和git merge的区别
使用Git log来参看commit时,其commit的顺序也有所不一样。
假设C3提交于9:00AM,C5提交于10:00AM,C4提交于11:00AM,C6提交于12:00AM,
对于使用git merge来合并所看到的commit的顺序(重新到旧)是:C7 ,C6,C4,C5,C3,C2,C1
对于使用git rebase来合并所看到的commit的顺序(重新到旧)是:C7 ,C6‘,C5',C4,C3,C2,C1
由于C6'提交只是C6提交的克隆,C5'提交只是C5提交的克隆,
从用户的角度看使用git rebase来合并后所看到的commit的顺序(重新到旧)是:C7 ,C6,C5,C4,C3,C2,C1
另外:
当本地和远程仓库都有代码更新时,直接push会失败。须要使用 git pull: 更新代码,git 会自动merge不一样的更新,
a. 若是git 自动merge成功,再进行 git push操做就会成功。
b. 若是git 自动merge失败,使用git status能够查看哪一个文件 merge失败,须要手动修改冲突地方,再进行git add git commit操做,以后再git push
But,这种方法提交后,就会在提交记录里显示 merge: *********************,而git rebase就能解决这种问题
15.git revert
git revert 是生成一个新的提交来撤销某次提交,这次提交以前的commit都会被保留
git reset 是回到某次提交,提交及以前的commit都会被保留,可是这次以后的修改都会被退回到暂存区
具体一个例子,假设有三个commit, git st:
commit3: add test3.c
commit2: add test2.c
commit1: add test1.c
当执行git revert HEAD~1时, commit2被撤销了
git log能够看到:
revert "commit2":this reverts commit 5fe21s2...
commit3: add test3.c
commit2: add test2.c
commit1: add test1.c
git status 没有任何变化若是换作执行git reset --soft(默认) HEAD~1后,运行git logcommit2: add test2.ccommit1: add test1.c运行git status, 则test3.c处于暂存区,准备提交。若是换作执行git reset --hard HEAD~1后,显示:HEAD is now at commit2,运行git logcommit2: add test2.ccommit1: add test1.c运行git st, 没有任何变化另外:git revert <commit log string>是撤消该commit,做为一个新的commit。