简介
Git是一款免费、开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。目前开发中大部分开发者都是使用的Git。
如果是初学者要由浅入深的完成学习Git的话,首推就是廖雪峰的Git教程。
如果说书籍的话,看书比较少,不过觉得《Android群英传:神兵利器》的第二章讲的还不错。书的PDF版 (侵删)。
书中的这张图觉得不错,有助于对Git的理解:
本文并不是一个对git讲解,而只是对常用的一些Git命令的整理。
盗一张图:该图将Git的常用操作已经做了很详尽的整理,使用的时候完全可以做在这张图中找。下面我也只是对该图做了一些整理,拣选了些更常用的。图片在这里保存好使不是很清晰,网盘分享了下 。
基本流程
-
全局配置
git config --global user.name "wooden" git config --global user.email "wooden.163.com"
-
创建新库,创建README.md并提交
git clone https://github.com/GwindIT/Test.git cd Test touch README.md git add README.md git commit -m "add README" git push -u origin master
-
已存在项目关联远程Git库
cd existing_folder git init git remote add origin https://github.com/GwindIT/Test.git git add . git commit git push -u origin master
常用操作
该部分的命令是摘取的更为常用的命令。
git clone <url> (创建新库)
git add . (添加所有文件到版本库)
git commit -m "msg" (提交所有修改)
git merge <branchname> (合并分支)
git checkout -b <branchname> ( 基于当前分支的末梢创建新分支并且检出分支)
git checkout <branchname> (检出分支)
git push (推入远程库)
git pull (获取并且合并到当前本地分支)
git diff (比较的是工作目录(Working tree)和暂存区域快照(index)之间的差异)
git status (列出当前目录所有还没有被git管理的文件和被git管理且被修改但还未提交(git commit)的文件)
本地操作
初始化
-
Git用户名邮箱的全局配置
git config --global user.name "wooden" git config --global user.email "wooden.163.com" git config --global color.ui "always"
-
初始化新版本库
git init
- 根目录下创建一个名为.git的文件夹。如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。
-
设置忽略文件
- 在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
-
添加文件到新版本库
- 添加单个文件:
git add somefile.txt
- 添加所有txt文件:
git add *.txt
- 添加所有文件,包括子目录,但不包括空目录:
git add .
- 仅监控已经被add的文件(即tracked file),会将被修改的文件提交到暂存区。add -u 不会提交新文件(git add -update)
git add -u
-
提交
- 提交
git commit -m "Message"
- add与commit的合并操作
git commit -am "Message"
但需要注意改命令只是提交修改的文件,当有新建的文件的时候是无法提交的。
日常操作
-
提交
- 提交所有修改文件
git commit -m "msg" -a
- 提交单个文件
git commit -m "add readme msg" readme.txt
-
撤销修改
-
撤销尚未提交的修改
- 撤销某个文件
git checkout head readme.txt
- 撤销所有txt文件
git checkout head *.txt
- 撤销所有文件
git checkout head .
-
撤销提交的修改
- 反转提交
git revert --no-commit head
生成一个新的提交来撤销某次提交,此次提交之前的commit都会被保留
- 复位
取消暂存:git reset head 或 git reset head <filename> 复位到head之前的版本:git reset --hard head
不会在版本中留下痕迹
-
-
分支
- 列出本地分支
git branch
- 列出所有分支
git branch -a
- 基于当前分支末梢创建新分支
git branch <branchname>
- 检出分支
git checkout <branchname>
- 基于当前分支的末梢创建新分支并且检出分支
git checkout -b <branchname>
-
合并分支
- 普通合并
git merge <branchname>
发生冲突不会自动提交,需要解决冲突。
- 压合合并
git merge -squash <brachename>
- 拣选合并
git cherry-pick --no-commit <branchname>
重命名分支
git branch -m <branchname> <newname> (不会覆盖已存在的同名分支) git branch -M <branchname> <newname> (覆盖已存在的同名分支)
- 删除分支
git branch -d new2 (如果分支没有被合并会删除失败) git branch -D new2 (即使分支没有被合并也照删不误)
-
解决冲突
- 冲突很少时,直接编辑冲突文件然后提交即可。
-
标签
- 创建标签
git tag 1.0 git tag -a v1.4 -m 'my version 1.4'
- 将标签推送到远程仓库
git push origin [tagname](单个标签) git push [origin] --tags(所有标签)
- 显示标签列表
git tag
- 检出标签
git checkout 1.0
- 由标签创建分支
git checkout -b b1.0 1.0 git branch b1.0 1.0
- 通常的git push不会将标签对象提交到git服务器,我们需要进行显式的操作:
git push origin v0.1.2 # 将v0.1.2标签提交到git服务器 git push origin –tags # 将本地所有标签一次性提交到git服务器
-
删除本地标签
git tag -d 1.0
-
删除远程标签
git push origin :refs/tags/标签名 git push origin :refs/tags/protobuf-2.5.0rc1
-
查看状态
- 当前状态
git status
- 历史记录
git log gitk (查看当前分支记录) gitk <branchname> (查看某分支历史记录) gitk -all (查看所有分支)
- 每个分支最后的提交
git branch -v
远程操作
初始化
-
克隆版本库
git clone <url>
-
别名
- 添加别名
git remote add <别名> <远程库URL>
- 删除别名
git remote rm <别名>
-
创建一个无本地分支的库
git branch -bare
日常操作
-
分支
- 列出远程分支
git branch -r
- 删除远程分支
git push origin --delete <BranchName>
- 删除远程已经不存在的分支
git remote prune origin
-
从远程获取
- 获取但不合并
git fetch <远程版本库>
- 获取并且合并到当前本地分支
git pull
-
推入远程库
git push origin master
-
本地分支与关联远程分支
git branch --set-upstream-to=origin/<branchename>