1.git log
查看 提交历史
默认不用任何参数的话,git log
会按提交时间列出所有的更新,最近的更新排在最上面
2.git log -p -2
常用 -p
选项展开显示每次提交的内容差异,用 -2
则仅显示最近的两次更新;
3.git log --stat
仅显示简要的增改行数统计
4.放弃本次修改
git checkout .
#本地所有修改的。没有的提交的,都返回到原来的状态
git stash
#把所有没有提交的修改暂存到stash里面。可用git stash pop回复。
git reset --hard HASH
#返回到某个节点,不保留修改。
git reset --soft HASH
#返回到某个节点。保留修改
某个节点是哪个节点?
指某次提交的版本ID,一般输入前几位即可。查看某次提交的版本ID可以通过git log 的方法,也可以
通过git reflog来查看,git reflog 可以查看所有分支的所有操作记录(包括(包括commit和reset的操作),
包括已经被删除的commit记录,git log则不能察看已经删除了的commit记录。
5.关于git reset --hard,git reset --soft,git reset --mixed的区别:
--hard 是本地代码,index,commmit都回退
--soft是代码保留,index保留,commit回退,可以随时提交;
--mixed是代码保留,index 和commit回退。
6.git revert
对于已经push的代码,回退本地代码其实也想同时回退线上代码,回滚到某个指定的版本,线上,线下代码保持一致就要用到git revert.
- git revert用于反转提交,执行evert命令时要求工作树必须是干净的.
- git revert用一个新提交来消除一个历史提交所做的任何修改.
- revert 之后你的本地代码会回滚到指定的历史版本,这时你再 git push 既可以把线上的代码更新.(这里不会像reset造成冲突的问题)
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.git diff
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文件,此时可以找到这些文件进行手动打补丁
学习无他法,唯有持之以恒
8.git fetch
$ 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
。
9.git rebase
暂时理解不了,以后再说。
10.误删分支怎么恢复
1)使用git log -g 找回之前提交的commit
2)使用git branch [新分支] commit_id 创建一个分支
3)切换到新分支,检查文件是否存在
11.git remote 命令
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
1、恢复改动。如果你要恢复的是最近的一次改动,git stash pop即可。如果有多次stash操作,那就通过git stash list查看stash列表,从中选择你想要pop的stash,运行命令git stash pop stash@{id}或者 git stash apply stash@{id}即可。
2、删除stash。git stash drop <stash@{id}> 如果不加stash编号,默认的就是删除最新的,也就是编号为0的那个,加编号就是删除指定编号的stash。git stash clear 是清除所有stash,整个世界一下子清净了!
3、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 log
commit2: add test2.c
commit1: add test1.c
运行git status, 则test3.c处于暂存区,准备提交。
如果换做执行git reset --hard HEAD~1后,
显示:HEAD is now at commit2,运行git log
commit2: add test2.c
commit1: add test1.c
运行git st, 没有任何变化
另外:
git revert <commit log string>是撤消该commit,作为一个新的commit。