git命令大合集
git init repo #初始化一个叫repo的本地git仓库
#实际上就是创建一个repo的目录,然后目录下放一个.git,.git包含了git的所有记录,判断一个目录是否为git仓库,就看有没有.git目录,有.git目录往下都属于同一个git仓库
#如果你把.git这个目录删除了,你的代码虽然还在,但是你的历史变更记录就全部没有了,所以一般别动这个.git
git add file #往暂存区添加一个叫file的文件
git diff #对比修改内容和git中最新记录的commit的区别,最好在add之前用git diff看一看,避免一些像加了空白键那种无效提交
git add . #往暂存区添加在git status中提示需要add的文件(git status不会提示被.gitignore忽略的文件)
git commit -m "blablabla" #把暂存区的内容正式提交到本地的当前分支,其中那个blablabla就是对本次提交的说明
git commit
# 最近实践发现加了-m,我会尽可能挤成一行来写,但是push到github后,查看commit的时候就发现写的记录信息全部挤在一行,难看死了,有些还被忽略了
# 所以不如直接git commit记录比较全面的信息
# 不过之前得先指定git config --global core.editor /usr/bin/vim,不然貌似默认用的是vi,vi的话就有可能在你保存的时候会崩溃
# 以至于你写的一堆提交信息全没了.
#git commit 还有一个-a的选项,是表示连同未add的文件改动也一同加进来,因为你可能add以后又改动了文件,而一般你前面add了内容就只用-m就可以了,不用-am
git status #查看当前所在git仓库情况
git log #查看提交历史,你会看到你自己之前commit时候的说明,各种blablabla
git reflog #查看操作历史
git clone HTTPS/SSH #克隆一个项目
# 常见的要么就是长成https型的(e.g. https://github.com/tesseract-ocr/tesseract.git)
# 要么就是长成ssh型的(e.g. git@github.com:tesseract-ocr/tesseract.git)
git remote -v #查看远程代码仓库的信息
git remote add origin HTTPS/SSH #添加一个叫origin远程仓库地址,一般克隆自带,如果是本地新创建的话就得执行这句,然后才能push
git remote remove origin #删除一个叫origin远程仓库地址
git push origin <本地分支>:<远程分支> #如果没有冒号后面的,此时默认推送到远程origin仓库的与<本地分支>同名的分支,如果不存在,则会被新建
git fetch --all #这条命令一般用于如果有人远程push了一条分支到repo,你本地想要拉下来,直接checkout提示本地没有,就可以fetch全部分支了~
git pull origin <远程分支>:<本地分支> #如果没有冒号后面的,此时默认拉取并合并远程仓库origin的 <远程分支>到当前分支,pull相当于fetch+merge
git pull --rebase origin dev <远程分支>:<本地分支> #拉取远程git代码仓库origin的dev分支更新,并以重建的方式合并到本地分支
#一般要是嫌麻烦,就像上面那样直接pull就好了,有些洁癖者喜欢用rebase保证本地的线性干净,本地可以rebase,远程就别这么做了
git merge --no-ff dev master #合并本地dev分支到master分支,洁癖者会为了干净历史加上--no-ff选项(--no-ff意思是no fast forward非快进式合并,某公司面试问了--no-ff含义)
git merge --no-ff dev #合并本地dev分支到本地当前分支,洁癖者会为了干净历史加上--no-ff选项
#冲突解决:在pull 和merge的时候会因为合并双方文件内容不一样而导致冲突,它会显示给你发生冲突的文件,并自动在冲突文件中标注好不一样的段落
#解决冲突其实已经有很多很好的工具了(比如vimdiff之类的),但是我觉得这些工具都稍显得复杂不简约,所以我推荐直接用vim打开发生冲突的脚本,手动修改好,保存
#用vim修改(sublime也不错)清晰方便,再add==>commit==>push就没问题了(第二次push是以你修改后提交为准,git这时候并不理会远程仓库的文件内容,直接覆盖过去~)
#或者修改好冲突以后就git add冲突的文件,再git merge --continue或者git rebase --continue,省去了commit的功夫
git branch #显示本地所有分支
git branch -D dev #-D是-d --force的shotcut,强制删除dev本地分支
git push origin :dev #删除远程仓库的dev分支,相当于把一个空分支push到远程仓库的dev上,等同于删除该分支。
git checkout -b dev #切换到dev分支,-b是没有dev分支时候才需要加上去的,这种情况下是创建并切换到dev分支的意思
git checkout -- file #撤销工作区中一个叫file的文件的修改
git reset HEAD file #撤销暂存区中一个叫file的文件到工作区中
git reset --hard HEAD^ #回滚当前分支到上一个版本,注意末尾的^,有n个^说明回滚多上个版本,也就是回到多少次commit前
git stash
#真是没有遇到问题就找不到来学习,用了那么久的git,现在才知道git stash这东西
#使用场景:
#当前工作区内容已被修改,但是并未完成(往往是写到一半有多).
#这时Boss来了,说前面的分支上面有一个Bug(容易出现在线上hotfix),需要立即修复。
#可是我又不想提交目前的修改,因为修改没有完成。
#但是,不提交的话,又没有办法checkout到前面的分支(checkout会报错)。
#此时可以用Git Stash就相当于备份工作区了。
#然后在checkout过去修改,就能够达到保存当前工作区,并及时恢复的作用
#简单应用:(最好不要过多缓存,因为pop的时候容易conflict)
git stash 缓存工作区修改
git stash list 当前的git stash栈打印出来
git stash pop 恢复所缓存内容
git stash clear 清除全部所缓存内容
git stash pop 相当于 git stash apply 加 git stash drop