关于git
的介绍实在太多,Google 或 百度一下 就有,再也不介绍。 git
我的接触 git
已经差很少三年,第一次使用git
做为版本管理工具时,网上查查资料也能使用,但习惯了svn
的客户端,感受学习git
的曲线很陡,不少命令老是很容易搞混或忘记,后来换工做又切回svn
了。直到最近加入新的team,彻底使用git
,通过不断请教和学习,该把成果整理概括一下,以备从此查询。github
我的认为实际用到的很少,通常都是现有的代码仓库,直接克隆下来,里面就有.git
目录svn
git init # 生成 .git 目录 git remote add origin git@github.com:my-name/proj.git # 本地和远程仓库关联
git clone git@github.com:my-name/proj.git
提交以前,先看一下本次 修改、删除、新增 了哪些文件工具
git status
git diff [/path/to/file] # 可指定文件,展现工做区和最新提交之间的差别,commit以前建议使用 git diff --stat # 展现工做区和最新提交之间的差别,只有文件名和行数 git diff HEAD # 比较本次提交和上次提交之间的差别,push以前建议使用 git diff 2265d4a86 4b94416057 # 比较两个历史版本之间的差别
提交仓库的变动,新增和修改文件命令相同学习
git add /path/to/file1 [/path/to/file2...] # 提交到本地暂存区,可同时提交多个文件 git commit -m '提交文件' # 保存暂存区的变动到当前分支 git push origin branch-name # 把变动文件推到当前分支对应的远程仓库
提交全部文件,可使用测试
git add -A git commit -m '提交全部文件'
或简写为fetch
git commit -am '简写:提交全部文件'
如提交以后,想修改最近一次提交信息,可以使用code
git commit --amend
git mv /path/to/old-file /path/to/new-file git commit -m '文件重命名' git push origin branch-name
git rm /path/to/file git commit -m '删除文件' git push origin branch-name
log 会已提交时间由近及远展现(不能看已删除的 commit log)开发
git log # 展现提交的哈希值、合并信息、做者、提交时间和备注信息 git log /path/to/file # 展现指定文件/目录提交的哈希值、合并信息、做者、提交时间和备注信息 git log --pretty=short # 展现提交的哈希值、合并信息、做者和备注信息的第一行 git log --pretty=online # 一行展现提交的哈希值、备注信息 git log --graph # 简单图形展现每次提交的分支及其分化衍合状况 git log -p [/path/to/file] # -p 会展现先后差别 git log --stat # 展现每次提交新增或删除的文件行数 git log --grep=test # 展现包含test关键字的提交 git log --author=myname # 展现做者是myname的提交
那么,有时想查看包括已删除在内的全部commit log,则使用rem
git reflog
git branch # 查看本地分支 git branch -r # 查看远程分支 git branch -a # 查看全部分支
git branch new-branch-1 # 新建分支 git checkout new-branch-1 # 切换新分支 git checkout master # 切换回到master
可简写为
git checkout -b new-branch-1
使用如下命令便可把本地分支推送到远程
git push origin new-branch-1
git branch -m old-branch-name new-branch-name git branch -M old-branch-name new-branch-name # 如已存在则强行覆盖
推送到远程,
git push origin new-branch-name
此时,远程同时存在两个分支 old-branch-name
和 new-branch-name
git checkout master # 不能删除当前所在分支 git branch -d old-branch-name # 删除本地分支,若有未合并的代码,将会删除失败 git branch -D old-branch-name # 强行删除,即便有未合并的代码 git push origin --delete old-branch-name # 删除远程分支 git push origin :old-branch-name # 把空推送到远程,也至关于删除远程分支
在推送以前,首先要确保本地已经跟远程仓库关联 仓库初始化
,再推送
git push origin new-branch-1
建议本地和远程分支的名称保持一致
git checkout -b new-branch-2 origin/new-branch-2
将远程分支的最新代码同步到本地
git pull origin new-branch-2 # 会自动merge # 等同于以下命令,注意git pull 和 git fetch 的区别 git fetch origin git merge origin/new-branch-2
git checkout master git merge --no-ff new-branch-1 # --no-ff 会把本次合并记录到历史记录中 git branch --merged # 查看已合并的分支 git branch --no-merged # 查看未合并的分支
当发生冲突时,打开冲突文件编辑,再参考 提交文件
提交便可
在提交到暂存区以前(即未 git add
),需撤销某个文件的修改,则使用
git checkout -- filename
如已经提交到暂存区,但 未git commit
,则使用
git reset HEAD filename git checkout -- filename
如 已 git commit
,则使用
git revert HEAD
还有一种状况,就是 恢复已删除的文件
,则使用
rm filename # 发现误删了 git checkout -- filename # 便可恢复
--hard
表示完全回退
git reset --hard HEAD~1 # 本地回退到上一个历史版本 git reset --hard 3b40bcb448c5b3 # 本地回到指定版本,能够是当前版本以前或以后的某一个版本 git reset --hard origin/master # 本地版本回到跟远程同样 git push -f origin your-branch # 回滚后的代码同步到远程
git remote -v git remote show origin # 查看某个远程仓库的详细信息
开发过程当中,不免遇到紧急插入的需求,不得不停下手头去处理问题,这时候就须要保留现场(包括
暂存区和工做区的内容),可以使用以下命令
git stash # 对当前的暂存区和工做区状态进行保存 git stash list # 查看保存的现场 git stash pop # 恢复保存的现场并删除现场快照
一些文件不想提交,可配置为忽略,在根目录下的文件.gitignore
加入要忽略的文件和目录便可。
在实际的使用过程当中,不少team 通常使用 Github、Gitlab、Bitbucket等进行管理。下面以 Github
为例。
如今Github
上已有项目 test_proj
,地址为 git@github.com:my-org/test_proj.git
项目名称都是虚构
Github
上fork
这个项目,完成以后你的开发分支就变成git@github.com:your-name/test_proj.git
。
git clone git@github.com:your-name/test_proj.git # 克隆项目 cd test_proj/ git remote add upstream git@github.com:my-org/test_proj.git # 很关键,设置我的分支的源仓库
基本操做命令
便可),都不会对源仓库有影响。Pull Request
(简称PR
),就能够等待项目的owner 进行代码审查和合并了。fork
本身的分支,提PR
也有前后顺序,也许咱们提PR
时,源仓库的代码已经通过了几回迭代,那么发生冲突的可能性就很是大。为了尽量避免代码冲突,设置我的分支的源仓库
这个步骤就显得很是关键了,咱们要在设置好源仓库以后,在开发过程当中,常常同步源仓库的代码,使用以下命令便可:
git pull upstream master # 同步master的最新代码到本地
目前团队使用的这种模式,这也跟开源项目的模式是一致的,我我的也很是喜欢,省事!
以前使用 Git-flow
模式开发,每次开发都须要从master
新建分支,merge
以后再删除分支,每次需求来了就反复新建分支,删除分支
,感受比较繁琐。
学习git
确实曲线比svn
陡,查了很多资料,还专门买了两本书来啃,花了大半个月,累死我了!
不过确实很是有收获,也很是开心,周末没出门,宅家里两天写完这篇博客,算是一个小小的总结吧!^_^