这里只记录我在读书后容易遗忘的一些指令或者注意点,供以后查询。整本书写的非常通俗易懂,而且有大量例子和图示来简化理解过程,非常值得一读。
安装配置
mac下安装很方便,使用brew直接安装
brew install git
安装完成以后记得配置一下,最好不要乱变。我之前交到github上的代码各种名字都有,非常混乱...
git config --global user.name "SuYan"
git config --global user.email suyan0830@gmail.com
配置修改的文件其实是~/.gitconfig
里的参数,也可以直接拿vim打开变更
Git基础
初始化项目
创建一个新项目
git init
git add README
git commit -m "initial project version"
如果不是从本地初始化项目,那么可以从远程克隆一个项目过来,例如从github上
git clone git://github.com/schacon/grit.git
git clone git://github.com/schacon/grit.git mygrit
文件更改、提交和回退
untracked状态
untracked状态即未由git管理
mkdir test && cd test && git init && touch README && git status
将untracked转为tracked状态
git add README && git status
从tracked状态转成untracked
git rm README --cached
unmodified状态和modified状态
unmodified状态是一个文件已经成为git管理的对象,而且已经提交过
git commit -m "add README file" && git status
之后就是unmodified状态了,这个时候可以进行文件修改和删除功能。删除一个文件可以:
git rm -f README
rm README
移动文件
git mv file_from file_to
修改文件直接显示成为modified状态
echo "sss" > README
查看修改
git diff
从modified状态回到unmodified状态
git checkout -- README
staged状态
staged状态指提交到版本控制库里
git commit -m "add README file" && git status
直接从modified状态进入staged状态
git commit -a -m "add README file" && git status
查看最新一次提交的修改
git diff -cached
查看最近两次更改/更新
git log -p -2
git log -2
提交完成后,文件进入staged暂存区,同时进入unmodified状态。如果想将REAMDE文件从staged状态回到提交前的modified状态
git reset HEAD README
再次修改如果不想重新生成commit,可以利用
git commit --amend
使用下面命令可以查看文件提交历史纪录
git log
回退到某次commit状态
git reset --hard HEAD^^
git reset --hard HEAD~2
git reset --hard as123s
忽略文件
在每个git控制的库中,都可以增加一个.gitignore
文件来控制例外的文件,即不想被git控制的一些临时文件或私有文件。它的文件格式如下:
# 注释将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件
# 不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 忽略 doc 目录下的所有 .txt 文件
# 会忽略 doc/notes.txt
# 但不包括 doc/server/arch.txt
doc/*.txt
远程仓库
查看远程仓库(如果仓库来自clone的话)
git remote -v
增加远程仓库(如果想提交到某远程仓库)
git remote add myremote git://github.com/schacon/grit.git
删除某远程仓库
git remote rm myremote
抓取远程仓库代码
git fetch myremote # 只获取更新
git pull # 获取更新并合并
提交代码到远程仓库
git push myremote master
查看远程仓库信息
git remote show origin
重命名远程仓库
git remote rename pb paul
删除远程仓库
git remote rm paul
打标签
标签可以用来标记仓库的版本号,如v0.1
列出现有标签
git tag
git tag -l 'v1.4.2.*'
含附注的标签
git tag -a v1.4 -m 'my version 1.4'
git show v1.4
签署标签
git tag -s v1.5 -m 'my signed 1.5 tag'
轻量级标签
git tag v1.4-lw
验证标签
git tag -v v1.4.2.1
后期加注标签
git log --pretty=oneline
git tag -a v1.2 9fceb02
分享标签
git push origin v1.5 # 只分享v1.5
git push origin --tags # 分享所有标签
技巧和窍门
自动完成:tab键
命令别名
git config --global alias.co checkout
Git分支
分支意味着从主线中分离出来,在不影响主线的同时继续工作。
基本分支
假设我们要做以下内容:
- 开发某个网站
- 创建一个分支,完成新的需求
- 收到bug修复任务,回到master分支
- 新建一个修复bug分支,直到修复完成
- 切换到之前开发新需求分支,继续工作
步骤如下:
新建分支并切换到其下工作
git checkout -b iss53
回到主分支
git checkout master
创建一个修复bug分支,并完成工作
git checkout -b 'hotfix'
修复完以后合并到master中
git checkout master
git merge hotfix
删除之前的hotfix
git branch -d hotfix
回到新需求分支
git checkout iss53
基本合并
把iss53中完成的新需求合并到master中
git checkout master
git merge iss53
冲突的合并
有的时候同一个文件被两个分支中都修改,合并时就会发生冲突。这个时候可以使用git status
来查询冲突文件。
解决冲突的方式是手动修改冲突位置,并将其使用git add
标记为已解决(resolved)。一但暂存,就表示冲突已经被解决。
然后通过git commit
来将此次提交,合并即完成
分支管理
显示分支命令
git branch
git branch -v #附加详细信息
git branch --merged #已合并分支
git branch --no-merged #未合并分支
删除分支
git branch -d testing
git branch -D testing #强制删除
分支式工作流程
由于Git的分支特性,许多开发者喜欢以这种方式来工作。比如仅在master分支中保留完全稳定的代码,即已经发布或即将发布的代码。
另外有一个develop或next的平行分支,专门用于后续的开发,或仅用于稳定性测试。
远程分支
远程分支会有一个指针指向克隆时的位置
git clone xxx@git:project.git
自己修改并不会影响到origin/master
的变化,如果远程分支发生了变化,可以用下面命令获得更新
git fetch origin
如果有多个远程分支,可以用下面命令来增加
git remote add teamone xxx2@git:project.git
git fetch teamone
推送
推送serverfix到远程serverfix分支
git push origin serverfix
推送到不同分支
git push origin serverfix:awesomebranch