创建
git init [dir] git init --bare [dir]
提交
git add <files> git commit -m "comment" git commit -a -m "comment"
状态
要随时掌握工作区的状态,使用 git status 命令。如果 git status 告诉你有文件被修改 过,用 git diff 可以查看修改内容。
时光穿梭
首先,Git 必须知道当前版本是哪个版本,在 Git 中,用 HEAD 表示当前版本,上一个版
本就是 HEAD^,上上一个版本就是 HEAD^^,当然往上 100 个版本写 100 个 ^ 比较容易数
不过来,所以写成 HEAD~100。HEAD 指向的版本就是当前版本,因此,Git 允许我们在版本
的历史之间穿梭,使用命令 git reset --hard commit_id/ 穿梭前,用 /git log
可以查看
提交历史,以便确定要回退到哪个版本。要重返未来,用 git reflog
查看命令历史,以便确
定要回到未来的哪个版本。
- 撤销修改
- 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,
用命令
git checkout -- file
- 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,
分两步,第一步用命令
git reset HEAD file
,就回到了场景1,第二步按场景1操作。 - 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考时光穿梭一节, 不过前提是没有推送到远程库。
- 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,
用命令
删除文件
命令
git rm
用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用 担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改 的内容。
远程库
添加远程库 要关联一个远程库,使用命令
git remote add origin git@server-name:path/repo-name.git
关联后,使用命令
git push -u origin master
第一次推送master分支的所有内容;此后,每次本地提交后,只要有必要, 就可以使用命令
git push origin master
推送最新修改;
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有 没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再 把本地提交推送一下就完成了同步,真是太方便了!
克隆仓库
要克隆一个仓库,首先必须知道仓库的地址,然后使用
git clone
命令克隆。Git 支持 多种协议,包括 https,但通过 ssh 支持的原生 git 协议速度最快。
分支管理
- 创建与合并分支
Git鼓励大量使用分支:
- 查看分支:
git branch
- 创建分支:
git branch <name>
- 切换分支:
git checkout <name>
- 创建+切换分支:
git checkout -b <name>
- 合并某分支到当前分支:
git merge <name>
- 删除分支:
git branch -d <name>
- 查看分支:
解决冲突
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。用 git log –graph命令可以看到分支合并图。
git log --graph --pretty=oneline --abbrev-commit
分支管理策略
Git分支十分强大,在团队开发中应该充分应用。合并分支时,加上
–no-ff
参数就可以用 普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就 看不出来曾经做过合并。Bug分支
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;当手头工作 没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop, 回到工作现场。
git stash git stash list
- 一是用
git stash apply
恢复,但是恢复后,stash 内容并不删除,你需要用git stash drop
来删除; - 另一种方式是用
git stash pop
,恢复的同时把stash内容也删了:
- 一是用
Feature分支
添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以, 每添加一个新功能,最好新建一个 feature 分支,在上面开发,完成后,合并,最后, 删除该 feature 分支。开发一个新 feature,最好新建一个分支;如果要丢弃一个没有 被合并过的分支,可以通过 =git branch -D <name> = 强行删除。
多人协作
查看远程库信息,使用
git remote -v
;本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用
git pull
抓取远程的新提交; 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name
, 本地和远程分支的名称最好一致; 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name
; 从远程抓取分支,使用git pull
,如果有冲突,要先处理冲突。
标签管理
- 创建标签
- 命令
git tag <name>
用于新建一个标签,默认为HEAD,也可以指定一个commit id; - 命令
git tag -a <tagname> -m "blablabla…"
可以指定标签信息; - 命令
git tag -s <tagname> -m "blablabla…"
可以用PGP签名标签; - 命令
git tag
可以查看所有标签。
- 命令
- 操作标签
- 命令
git push origin <tagname>
可以推送一个本地标签; - 命令
git push origin --tags
可以推送全部未推送过的本地标签; - 命令
git tag -d <tagname>
可以删除一个本地标签; - 命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签。
- 命令
自定义Git
- 忽略特殊文件 忽略某些文件时,需要编写.gitignore; .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!
- 配置别名
git config –global alias.st status
git config –global alias.co checkout
git config –global alias.ci commit
git config –global alias.br branch
git config –global alias.unstage 'reset HEAD'
git config –global alias.last 'log -1'
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 的时候,加上
–global
是针对当前用户起作用的, 如果不加,那只针对当前的仓库起作用。 配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中:$ cat .git/config
别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。 而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中:
$ cat .gitconfig
配置别名也可以直接修改这个文件,如果改错了,可以删掉文件重新通过命令配置。