以下的git命令是我参考了廖雪峰等关于git的文章之后,根据自己实际工作中接触到的情况而总结出来的一份清单,也是之前在公司用来培训的资料。我会继续补充和修改,欢迎留言指教。
自报家门
git config --global user.name "RystLee” && git config --global user.email "rystlee100@gmail.com"
搭建仓库
git init
(产生的.git是版本库文件)查看仓库的状况
git status
查看仓库中的文件有什么变化
git diff <file>
确定仓库中的文件的变化没问题,将文件添加缓冲区(stage)并提交到仓库(分支)
git add <file> && git commit -m "comments"
注:添加到暂存区的文件,再对其进行修改不会影响他们接下来的commit操作查看最近的改动
git log [—pretty=oneline]
将文件从缓冲区撤回
git reset HEAD <file>
放弃文件最近一次的修改
git checkout — <file>
时光机
回到过去:git reset —hard commit_id 或者 HEAD^
HEAD是指针 指向当前版本 HEAD^^指向上上个版本 HEAD~10指向上第10个版本
返回现在: git reflog
查看提交历史,找到你要的commit_id
删除文件
git rm <file>
-
远程仓库GitHub
创建SSH Key: 在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,
ssh-keygen -t rsa -C "rystlee100@gmail.com"
。然后将id_rsa.pub的内容拷贝到github的账户列表里。将本地仓库和github上的远程库关联并将本地的内容推送到远程库
git remote add origin git@github.com:rystlee/learngit.git && git push -u origin master
; origin是远程库的默认名称, -u参数负责将本地的master分支与远程的master分支关联起来,在以后的推送时不要加该参数git push origin master
克隆远程库
git clone git@github.com:rystlee/learngit.git
查看远程库信息
git remote -v
创建分支
git checkout -b dev
(加上-b参数相当于两条命令:git branch dev && git checkout dev
)合并分支 在dev上工作完成之后,切回master,执行合并,然后删除dev:
git checkout master && git merge dev && git branch -d dev
查看所有的分支
git branch
(分支前有*号的表示当前工作的分支)查看分支合并图
git log —graph
Fast Forward 默认的分支合并图是丢掉分支信息的。禁用fast forward模式会新建一个commit来进行合并,这样就会将分支信息保存下来
git merge —no-ff -m "merge with no-ff" dev
Bug分支 通过建立临时分支来修复bug,但是如果当你在dev上进行的工作还没完成而不能提交时,可以使用git stash来把当前的工作现场临时”藏匿”起来,这样git status查看工作区将会是干净的,现在你可以选择在master或者dev上建立一个临时的bug分支来进行修复bug的工做了。完成bug修复任务之后,git stash list查看之前藏匿的”工作现场”记录
$ git stash list
stash@{0}: WIP on dev: 6224937 add merge
使用git stash apply stash@{0}
来恢复,使用git stash drop stash@{0}
来删除或者使用git stash pop
将最近的工作现场恢复并删除记录。
一般情况:当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再git stash pop
,回到之前的工作现场。Feature分支 开发一个新功能,最好新建一个分支,如果要丢弃一个没有被合并过的分支,可以通过
git branch -D <name>
强行删除该分支。如果直接在dev分支上开发该特性,那就可能比较麻烦了。推送分支到远程库
git push origin master
或推送其他分支,如devgit push origin dev
; Bug分支只用于本地修复bug,就没必要推送到远程了,除非老板要看看你每周到底修复了几个bug; Feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。抓取分支 克隆远程库,默认情况下,只能看到master分支;如果想在dev分支上进行开发,就必须创建远程origin的dev分支到本地,命令是
git checkout -b dev origin/dev
这样就建立了本地dev分支并与远程dev分支的进行了链接关联分支 如果git pull 或 git push提示”no tracking information”,则说明将本地的分支和远程的分支没有链接,用命令
git branch —track <local_branch> origin/<remote_branch>
进行链接。多人协作的工作模式通常是:
首先,可以试图用git push origin <branch>
推送自己的修改;
如果推送失败,则因为远程分支比你本地的新,需要先用git pull
试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin <branch>
推送标签是版本库的快照,实质是指向某个commit的一个指针。
git tag <tagname>
新建一个标签,默认为HEAD,也可以指定一个commit_idgit tag -a <tagname> -m “comments”
可以指定标签信息git tag -s <tagname> -m “comments”
可以用PGP签名标签git tag
查看所有标签git show <tagname>
查看某个标签git tag -d <tagname>
删除标签git push origin <tagname>
推送标签到远程git push origin —tags
推送所有标签到远程git push origin :refs/tags/<tagname>
删除远程库的标签(先将本地要删除的标签干掉,该推送就会将远程的标签同步删除)让git适当的显示不同的颜色
git config —global color.ui true
忽略特殊文件 https://github.com/github/git... 然后再加上自己定义的文件,最终得到一个完整的.gitignore文件
设置命令的别名
git config —global alias.unstage ‘reset HEAD’ -> git unstage test.php
(将暂存区的修改撤销)git config —global alias.last ‘log -l’ -> git last
(显示最后一次提交信息)
有人丧心病狂git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
比较分支 合并分支之前可以先进行比较
git diff <branch1> <branch2>
关联本地仓库和远程仓库 如果你不是clone的远程仓库,就需要进行关联操作:
git remote add origin <server>:<repository>
清理本地对应的远程已经删除的分支
git remote prune origin
比较当前文件和上一次提交之间的差异
git diff HEAD^ HEAD <file>
找出是谁最近改动过代码
git blame <file>
,配合grep使用效果更佳
注意事项
所有的版本控制系统,其实只能跟踪文本文件的改动,不能跟踪二进制文件内容的改动,不幸的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的
Git设计优秀主要是因为它跟踪管理的是修改,而非文件,每个文件只有一份,git会根据分支记录的修改去控制工作区中的文件的内容。
master也是分支,但却是主分支,HEAD指针指向的分支是当前工作的分支,良好的开发方式是新建一个分支(名字可以是dev)进行开发,然后add、commit等,最后再切回master进行merge操作,master分支仅用来发布新版本。
本地创建的分支如果不推送到远程,对其他人就是不可见的。
修改文件未提交时切换分支,修改的内容会同步到切换到的分支上,直到提交之后。
.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。正确的做法应该是:git rm --cached logs/xx.log,然后更新 .gitignore 忽略掉目标文件,最后git commit -m "We really don't want Git to track this anymore!"
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。