1、我想查看某次提交修改了哪些内容,就像使用diff一样详细的列出来。
git show 提交的commit ID
例如: git show 9897e8f (不知道commit id ,可以先使用git log查看得到,一长串数字便是)
有可能我只想看这次提交的某个文件修改的具体内容,
git show 提交的commit ID -- 文件名
例如: git show 9897e8f -- /home/dijiang/hello.cxx (文件名要带路径)
2、将某个文件的历史修改内容都显示出来:
git log -p 文件名
例如:git log -p ./hello.cxx
3、现已知有一个远程库http:172.29.0.1/hello.git ,如何在本地创建一个分支并且跟踪远程库中的某个版本呢?
分为5步:
(1)找一个干净的目录(或者新建一个),比如叫learn。进入到该目录:cd learn
(2)克隆该远程库:git clone http:172.29.0.1/hello.git
(3)克隆完此时learn目录下应该生成一个hello目录(和项目名一致),继续进入该子目录:cd hello
(4)列出远程库所有的分支(查看你想跟踪的那个分支):git branch -a (一般叫remote/origin/api等等)
(5)创建本地分支并和远程的分支关联:git checkout -b dijiang origin/api (-b 参数不能少,dijiang就是我现在的本地的分支名,origin/api就是我要跟踪的远程库中的某个分支名,就上一步git branch -a 列出的去除remote字符串。)
这时git status查看当前状态,便会发现位于分支dijiang, 与上游分支origin/api一致
4、本地版本比远程库的版本要新,此时要想本地库和远程版本库一致,如果使用git pull 并不能使本地版本和远程版本一致,使用git status 查看还是领先远程版本好多次提交。
要到达一致目的,需要使用如下命令:
git reset --hard origin/master (master为远程分支,替换成你要想一致的远程分支)
5、由于某些错误操作导致本地分支不再和某个远程分支相关联,git status 不再提示与上游分支origin/XXX一致,该如何修复呢?
(1)首先切换到本地分支dijiang:git checkout dijiang
(2)git branch --set-upstream-to=origin/api 便将本地dijiang分支和远程api分支关联起来啦。(前提是已经关联过远程分支:git remote add http:172.29.0.1/hello.git。不行就先删了远程库:git remote remove origin,然后再关联)
6、push 命令详解
git push命令用于将本地分支的更新,推送到远程主机。
$ git push <远程主机名> <本地分支名>:<远程分支名>
git push <远程主机名> <本地分支名>:<远程分支名>
注意,分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。
如果省略远程分支名,则表示将本地分支推送与之存在”追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
$ git push origin dijiang:master
上面命令表示,将本地的dijiang分支推送到origin主机的master分支。如果后者不存在,则会被新建。
7、版本回退:
git reset --hard commit_id(提交的ID)
便可以会退到某次提交的版本
8、更改远程库的地址:
(1)查看远程库的地址:gitremote –v
origin http://171.22.32.11/hello.git(fetch)
origin http://171.22.32.11/hello.git(push)
(2)删除与已经存在的远程库的关联
git remote rm origin
(3)新增远程的地址
gitremote add origin http://122.122.12.11/hello.git
再次查看便成功了。
9、git合并冲突
打开冲突文件
<<<<<<<<<与======之间的是我修改的。而===========与>>>>>>>>>>>>>之间是别人修改的。
将内容修改后,并且删掉<<<<<<等这些标志后重新提交就解决简单的冲突了。
10、将暂存区文件退回到工作区:
git reset -- files 用来撤销最后一次的git add files(因为每git add file一次,暂存区的文件都会被更改一次)
ps: git checkout -- files 把文件从暂存区域复制到工作目录,用来丢弃本地修改
git checkout . (这是一个点) 本地所有修改的,没有的提交的,都返回到原来的状态(丢弃掉所有的未提交的修改)
11、git diff详解:
git diff 是对比出尚未git add文件的差异,该命令可以后面加个路径,只对比出某个文件的差异。
如果已经git add的文件如何进行对比呢?使用选项 --cached,例如git diff --cached ./test.cpp 。改命令只显示出已经git add部分的差异,而后续对test.cpp的修改部分如果没有git add则不显示。
如果只要没有git commit的文件不管有没有git add都对比出差异,则使用HEAD选项,例如git diff HEAD ./test.cpp 。对比出test.cpp自从上次提交后的所有修改。
12、删除某一个配置项:
比如先前设置了 git config --global core.whitespace cr-at-eol 这个忽略换行符的命令,后来发现这样至少掩耳盗铃,反而不好发现有问题的行,于是想将该配置删除。只要在设置的命令加个--unset选项即可,例如git config --global --unset core.whitespace cr-at-eol
13、设置代理
由于万恶的防火墙导致有时候从github上clone项目异常缓慢,甚至失败。我们可以给git设置代理从而正常克隆github上的项目。
设置代理的命令如下:
//设置代理
git config --global http.proxy 'socks5://127.0.0.1:1080' //换成自己的有效的代理
git config --global https.proxy 'socks5://127.0.0.1:1080'
//取消代理
git config --global --unset http.proxy
git config --global --unset https.proxy
14、删除所有未追踪(git add)的文件
有时候一不小心误操作,产生很多不需要的文件,如果在很多不同的目录一个一个手动删除很麻烦,使用以下命令即可删除:
git clean -xdf
如果既想要删除未追踪的文件也想还原修改的,参照上面第10条介绍的和本条介绍的组合下就好啦:
git checkout . && git clean -xdf
15、使用git 打补丁:
先回顾下git diff 高级用法:
- git diff commitId filepath 当前与某一次提交进行比较,filepath可选(有就比较一个文件,没有就比较所有的文件)
- git diff commitID1 commitID2 两次 commit 提交间文件对比
使用git diff 生成patch文件:
git diff > test.patch
将patch 应用到某个分支上
git apply --whitespace=fix test.patch
此时git diff的修改就全部应用到文件上了,可自行git status查看。
apply patch前可先使用check 检查下是否可以apply:git apply --check test.patch。
如果不小心apply产生错乱啥的想还原,上面14条来救场。