以下的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 或推送其他分支,如dev git 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_id
    git 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!"

原文链接:https://macken.me/article/git-instructions


麦肯先生
263 声望10 粉丝

[链接]