本文内容是学习《Pro Git》 https://git-scm.com/book/en/v2 一书后的心得 ,融合了本人自己的理解和实际遇到的问题,最后整理而成。注:本文会不定期更新,请关注 云栖社区@一唐。
1、在命令窗口输入 $ git help 即可查看git的使用帮助,若不能使用此命令,说明git没有安装好;2、查看某个git命令的帮助,例如查看config命令的帮助 $ git help config
$ git config --global user.email YourName@smallez.com
配置分为三级:系统配置、当前用户配置、当前Git库配置“当前Git库配置”会覆盖“当前用户配置”,“当前用户配置”会覆盖“系统配置”修改系统配置方法 $ git config --system user.name "YourName" 修改当前用户配置方法 $ git config --global user.name "YourName" 修改当前Git库配置方法(先进入到该Git库的目录) $ git config user.name "YourName" 查看当前的某项配置是什么 $ git config user.name查看当前Git库的状态 $ git status 可以知道:
a、当前所在分支(On branch xxxx)b、哪些文件处于暂存区(Changes to be committed)c、哪些属于“未跟踪”状态的新文件(Untracked files)d、哪些属于被修改但未处于暂存区的已跟踪文件(Changes not staged for commit)简要查看当前Git库的状态 $ git status -s前面标识含义:
?? 未跟踪文件A 新添加到暂存区中的文件M 文件被修改了并放入了暂存区 M (注意M的左边有个空格)文件被修改了但是还没放入暂存区(需要再 git add 一下)MM 在工作区被修改并添加到暂存区后又在工作区中被修改了(需要再 git add 一下)AM 新添加到暂存区中的文件,还未提交的情况下又被修改了(需要再 git add 一下)查看工作区文件和暂存区文件之间的差异 $ git diff 查看已经暂存起来的文件变化状况 $ git diff --cached 调用文本编辑器并提交更新 $ git commit (按回车后会出现文本编辑窗口,让你输入相关的修改记录信息,比如描述自己新增加了哪些内容、哪些功能等)自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过加入暂存区的操作 $ git commit -a -m 'new comment' 删除文件 $ git rm filename.txt (如果只是 rm filename.txt ,并不能起到删除暂存区文件的作用)文件被修改了并已添加到暂存区的删除 $ git rm -f filename.txt (此时需要加-f强制删除)文件被误放入暂存区,需要移出来 $ git rm --cached filename.txt (可以使用通配符,如 *.log 表示.log结尾的文件, dir/*.a 表示dir目录下.a结尾的文件,请务必注意*号前面要加 )文件改名 $ git mv oldname newname 相当于执行了三条命令:$ mv oldname newname$ git rm oldname$ git add newname 补充提交操作,比如提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了,可参考下面的步骤:$ git commit -m 'comment' #此时发现忘了提交forgotten.txt文件$ git add forgotten.txt #加上forgotten.txt$ git commit --amend #用--amend参数补交,按下回车后会让你编辑前面的comment信息给某个提交历史打标签 $ git tag -a v1.1 085bb3 -m 'my version 1.1' (085bb3是该历史版本的SHA-1校验码前6位)查看本地库有哪些标签 $ git tag (标签只是一个历史提交的别名而已)查看指定模式匹配的标签 $ git tag -l 'v1.8*' 给当前版本打标签 $ git tag -a v1.2 -m 'smallez_version 1.2' 查看指定标签版本对应的提交信息 $ git show v1.1 检查要提交的文件中是否包含多余的空白字符 $ git diff --check 把format-patch补丁文件应用到当前分支 $ git am patch-smallez-client.patch 把老式diff补丁文件应用到当前分支 $ git apply patch-smallez-client.patch 输出master分支最后一次提交的可读名称 $ git describe master (如果最后一次提交设置了标签,就显示标签名,否则由最近的标签名、自该标签之后的提交数目和它部分SHA-1值构成)为master分支打包创建一个归档 $ git archive master --prefix='projname/' | gzip > `projname_v1.x`.tar.gz 接上面,如果要生成zip格式 $ git archive master --prefix='projname/' --format=zip > `projname_v1.x`.zip 生成自master分支v1.1(标签名)以来的changelog $ git shortlog --no-merges master --not v1.1 (如果已经合并到master,此命令就没意义了)查看某个提交的父提交(就是上一个提交)信息 $ git show d921970^ (使用^符号)从工作目录查找一个包含某关键字的文件 $ git grep -n keyword 将某个版本恢复到工作区 $ git checkout d92197 (d92197是要恢复的提交历史的SHA-1前6位) ,如果要再恢复到最新的提交 $ git checkout branch_name (branch_name是分支名称)把本地库的master分支版本推送到简写名为origin的远程库 $ git push origin master可能会推送失败的情况:
a、没有远程库的写入权限b、上次从远程库抓取文件下来后,在你准备推送前,又有其它人更新了远程库c、由于上面的情况导致服务器上的文件可能会比你本地的要新,所以必须先从远程服务器拉取最新的文件合并到你的本地库后才能推送查看某个远程仓库的信息 $ git remote show remote-name 当把本地库文件推送到远程库时,并不会把标签信息也自动推送过去,要另外用命令推送 $ git push origin v1.5 把所有不在远程库上的本地标签都推送过去 $ git push origin --tags 用指定的标签创建一个新分支 $ git checkout -b branchname tagname 把本地库的master分支推送到命名为origin的远程库的master分支,并建立跟踪 $ git push -u origin master 把本地库的test分支推送到命名为origin的远程库的newtest分支,并建立跟踪 $ git push -u origin test:newtest当从远程库抓取更新文件时,发现一个新的分支,本地不会自动生成一份可编辑的拷贝,解决方法:
a、抓取远程库 $ git fetch origin (发现远程库有serverfix分支)b、在本地库创建localfix分支,并让它保持和origin/serverfix跟踪 $ git checkout -b localfix origin/serverfixc、上面的操作,如果localfix名字变成了serverfix(即和远程库一样),可以简化成这样 $ git checkout --track origin/serverfix d、如果要在本地已有的分支跟踪一个远程分支 $ git branch -u origin/serverfix 可以用@{upstream}或@{u} 作为快捷字符,来代替正在跟踪的分支路径,比如 origin/master查看本地分支和远程分支的对应列表 $ git branch -vv (注意它只是在本地做比较并未连到远程服务器,第20条有说明)显示含义:
a、 master 1ae2a45 [origin/master] deploying index 表示本地master分支正在跟踪origin/master分支并且是最新的b、 iss53 7e424c3 [origin/iss53: ahead 2, behind 1] forgot the brackets 表示iss53分支正在跟踪origin/iss53并且ahead是2,意味着本地有两个提交还没有推送到服务器上,behind 1表示落后1,服务器上有一次提交还没抓到本地并入接上面第19条,先抓取所有的远程库,然后再显示列表 $ git fetch --all; git branch -vv 删除远程库的分支 $ git push origin --delete serverfix 生成自己对远程库版本做了哪些修改的摘要 $ git request-pull origin/master myfork$ git branch new-branch-name$ git checkout new-branch-name
假如当前分支是master,有一个包含最新修改的hotfix分支需要合并过来,使用 $ git merge hotfix 假设已完成了上面的第6个操作,hotfix分支已经没用了,需要删除hotfix分支 $ git branch -d hotfix合并分支时发生冲突的解决方法:
a、先查看哪些文件冲突了 $ git status (会出现Unmerged paths)b、手工打开这些文件,修改里面的代码,并删除 <<<<<<< , ======= , 和 >>>>>>>c、把修改好的文件全都添加到暂存区 $ git add filename d、改完所有冲突的文件并都添加到暂存区后提交它们即可 $ git commit 查看当前库所有分支的列表 $ git branch (前面有*星号的是当前工作的分支)查看每一个分支的最后一次提交 $ git branch -v 查看哪些分支已经合并到当前分支 $ git branch --merged (未打*星号的分支都是已并入的,已经没用了,可以删除掉)查看所有包含未合并工作的分支 $ git branch --no-merged 强制删除一个未合并工作的分支 $ git branch -D unmerged-branch-name 合并(merge)和变基(rebase)的区别:合并会保留历史分叉信息,变基会把一个分支上的变化应用到另一个分支上,去掉了分叉fix分支变基到master:把fix分支上的修改应用到master上,再把fix和master合并,最后只保留master,删除fix
a、先切换到fix分支 $ git checkout fix b、变基到master分支上 $ git rebase master 或者 $ git rebase master fix c、切换到master分支 $ git checkout master d、把fix合并到master上 $ git merge fix e、删除fix分支 $ git branch -d fix 变基的使用注意事项:如果版本分叉历史已提交到了远程库,切勿再在本地用变基的方法抹平这些分叉基于master分支建立带命名空间的分支 $ git branch sc/branchname master (其中sc是贡献该项工作的人名称的简写)