前一篇讲了git 的本地操作命令。git基础命令(一)。现在这篇主要讲下合并,拉取和推送。
git checkout
git checkout -b branchname用于创建一个和当前分支一样的branchname的分支,并且切换到新分支上。
git checkout -B branchname会强制创建一个和当前分支一样的branchname分支,如果本地已经有相同的分支名,就会覆盖原来的分支。
Git checkout --merge这个命令适用于在切换分支的时候,将当前分支修改的内容一起打包带走,同步到切换的分支下。所以这个命令,慎用!因为当前分支修改的内容会丢失,而且如果分支间的内容不一样的话容易造成冲突。
git checkout 【path】时会丢失掉已经修改过的内容。Git checkout .会将当前工作区的内容清除掉。(原理是以最新的存储时间节点(add和commit)为参照,覆盖工作区对应文件file)
git reset
git reset[--hard|soft|mixed|merge|keep] [<commitid>或HEAD]
Git reset可将当前分支重新设定到某一次提交时。
Git reset有5种模式,对应对index和workingcopy不同的更新。
--hard会更改中心仓库的head指针、重置暂存区还会清除工作区的更改。在实际中慎用这个参数。
--soft只是更改了中心仓库的head指针,暂存区和工作区没有更改。
--mixed是一个中间的做法,会更改中心仓库的head指针,重置暂存区但是工作区不会清除。在开发中大多使用这种模式,这也是reset默认的模式。
--merge可以清除已经暂存的改变但是不会清除本地在workingcopy中的改变。例如:你在本地添加了一些代码,这时执行了git pull命令,但是你发现pull的结果不满意,想要回退,那么如果直接使用hard参数会把工作区的修改也清除有副作用,那么这时可使用merge这样就可以回退而且也不会清除workingcopy的内容。
--keep用于保留工作区但是丢弃之前的一些commit。例如提交了几次,但是突然间发现提交到错误分支上了,这时可切换到正确的分支上使用reset --keep就可以清除之前的提交,将改变还原到工作区。下面是例子:
Git tag change1
Git checkout -b branch1
Coding.coding,coding…
Git commit -a -m “message”
fixbug.fixbug.fixbug…
git commit -a -m “message”
git checkout -b branch2
git reset --keep change1
此时change1后的commit都会清除,现在都在工作区等待被提交。
git merge
Git merge 【branch或commitid】 把一个分支或或某个commit的修改合并到现在的分支上。
如果没有冲突的话,合并完成,如果有冲突就要合并冲突,打开文件,解决冲突,再使用git add 添加文件到暂存区。但这样很麻烦,可以调用merge tool 图形化工具来合并冲突。我推荐的图形化合并冲突工具是beyond compare。网上有教程。
git diff
git diff 用于比较两次快照的差异。
直接使用git diff 时表示比较工作区和暂存区的差异。
git diff --stat 可以简单查看差异结果。
git diff branch_a branch_b 用来比较branch_a 和branch_b分支的不同。
git pull
git pull 【远程主机】【本地分支】:【远程分支】相当于是从远程获取最新版本并merge到本地(git fetch origin master:test)
git pull 大多会跟一个rebase 参数(git pull --rebase)。这样可以更安全。它的过程是:新建一个和当前分支一样的分支,从远程拉取并合并到新建的分支上,如果有冲突会提示冲突,这里使用git branch 可以看到当前分支是一个临时分支,解决完冲突后使用git rebase --continue 可以继续合并。合并完成后再把新建的分支合并到原来的分支上,再删除临时分支。
git pull 失败 ,提示:fatal: refusing to merge unrelated histories
git pull origin master--allow-unrelated-histories
git fetch
git fetch 相当于是从远程获取最新版本到本地,不会自动merge
git push
git push 【远程主机】【本地分支】:【远程分支】
可使用 git remote add origin ssh://git@dev.lemote.com/rt4ls.git 为远程分支设置别名。
1. 1git push origin master
如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
1.2 git push origin :refs/for/master
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin --delete master。
1.3 git push origin
如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支。
git log
git log 可用于查看最近的提交信息。
-p 可显示每次提交的内容差异。
-number 可显示指定number条数的提交信息。如:git log -p -3
git log --stat 仅简要的显示 文件 增改行数统计。
git log --author=[author name]可以指定作者的提交历史。
git log --since --before --until --after根据提交时间筛选log。
git log --oneline --graph:可以图形化地表示出分支合并历史。
git log --grep根据commit信息过滤log: git log --grep=keywords。
默认情况下, git log --grep --author是OR的关系,即满足一条即被返回,如果你想让它们是AND的关系,可以加上--all-match的option。
例如:
git log --since=2.months.ago --until=1.day.ago --author=harvey_dong -S "something" --all-match
网友评论