Git Hand Book Git 官方站点: http://git-scm.com/download
0x01 全局 Git 设置 1 2 3 4 5 6 7 8 9 10 11 12 # $ git config --global user.name "git" $ git config --global user.email "git@gmail.com" # $ git config --global credential.helper store # 取消ssl认证 $ git config --global http.sslVerify false # $ git config --list
0x02 创建 Git 仓库 1 从远程仓库克隆到本地 1 2 3 $ git clone git://github.com/schacon/grit.git $ git clone git://github.com/schacon/grit.git mygrit $ git clone git://github.com/schacon/grit.git mygrit --recursive
2 Create a new repository 1 2 3 4 5 6 $ echo "Git Hand Book" >> README.md$ git init $ git add README.md $ git commit -m "add README" $ git remote add origin git://github.com/schacon/grit.git $ git push -u origin master
3 Existing folder 1 2 3 4 5 6 $ cd existing_folder$ git init $ git remote add origin git://github.com/schacon/grit.git $ git add . $ git commit $ git push -u origin master
4 Existing Git repository 1 2 3 4 $ cd existing_repo$ git remote add origin git://github.com/schacon/grit.git $ git push -u origin --all $ git push -u origin --tags
0x03 Git 分支 1 查看分支 1 2 $ git branch -a $ git branch -v
2 切换分支 1 2 3 $ git branch iss53 $ git checkout iss53 $ git checkout -b hotfix
3 创建分支 3.1 创建本地分支,远程分支,并关联
1 2 3 4 $ git checkout -b serverfix origin/serverfix $ git push origin serverfix $ git branch --set-upstream-to=origin/serverfix $ git branch -a
3.2 创建独立分支
1 2 $ git checkout --orphan <branch-name> $ git rm -rf .
4 删除分支 4.1 删除本地分支
4.2 删除远程分支
1 $ git push origin :develop
4.3 远程分支已经删除,本地通过 git branch -a
还能看到
1 2 $ git remote show origin $ git remote prune origin
5 合并分支 5.1 方式一 merge 1 2 $ git checkout master $ git merge develop
merge 遇到冲突,先解决冲突,然后
1 2 $ git add <filename> $ git commit
5.2 方式二 rebase 1 2 3 4 5 $ git checkout develop $ git rebase master # $ git rebase master develop
然后回到 master 分支进行快速合并
1 2 $ git checkout master $ git merge develop
rebase 遇到冲突,先解决冲突,然后
1 2 $ git add <filename> $ git rebase --continue
5.3 Git rebase 高级用法 5.3.1 解除特殊情境下两个分支的依赖关系
1 2 3 4 5 H---I---J topicB / E---F---G topicA / A---B---C---D master
1 $ git rebase --onto master topicA topicB
1 2 3 4 5 H'--I'--J' topicB / | E---F---G topicA |/ A---B---C---D master
5.3.2 删除部分提交
1 E---F---G---H---I---J topicA
1 git rebase --onto topicA~5 topicA~3 topicA
5.3.3 可交互式变基
交互式变基意味着您有机会编辑被重基的提交。 您可以重新排序提交,并可以删除它们(清除坏的或不需要的补丁)
1 2 3 4 5 $ git rebase -i master $ git rebase -i <after-this-commit> $ git rebase -i HEAD~5
然后根据 vim 提示操作,最后:wq
保存退出就可以执行当前操作
0x04 Git remote 使用 1 2 3 4 5 6 7 8 9 10 11 12 $ git remote add origin git://github.com/paulboone/ticgit.git $ git remote set-url origin <newurl> $ git remote $ git remote -v $ git remote show origin $ git fetch [remote-name] $ git pull $ git push origin master $ git remote rename origin paul $ git remote rm origin
1 常用标签管理命令 1 2 3 4 5 $ git tag $ git tag v1.4-lw $ git tag -a v1.0 21f1f43 -m "my version 1.0" $ git show v1.0 $ git push origin --tags
1 $ git tag -l | xargs git tag -d && git fetch -t
0x06 子模块 1 2 3 $ git submodule add http://framework.git framework $ git clone project.git project3 --recursive $ git submodule update --init --recursive
0x07 Git Stashing 1 2 3 4 5 $ git stash $ git stash list $ git stash apply 0 $ git stash pop $ git stash clear
0x08 Git 经常遇到的问题 1 git pull 时遇到 error: cannot lock ref ‘xxx’ git pull
时经常遇到 error: cannot lock ref 'refs/remotes/origin/dev': is at xxx but expected xxx
问题原因 :
在 git push 的时候使用了 git push –force,导致远端分支被覆盖,导致你本地的 refs 与远端不一致。
删除掉这个远端分支又重新新建了这个分支也会出现同样的问题。
1 2 $ git update-ref -d refs/remotes/origin/dev $ git pull -p
2 回退到指定版本 1 2 $ git reset --hard e418f25 $ git push origin HEAD --force
3 撤销操作 1 2 $ git reset HEAD benchmarks.rb $ git checkout -- benchmarks.rb
4 修补上一次提交遗漏(push 前使用) 1 2 3 $ git commit -m 'initial commit' $ git add forgotten_file $ git commit --amend
5 图形化日志 1 $ git log --oneline --decorate --graph
0x09 Git Flow
0x99 .gitignore
文件 1 2 3 4 5 6 # 此为注释 – 将被 Git 忽略 *.a # 忽略所有 .a 结尾的文件 !lib.a # 但 lib.a 除外 /TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO build/ # 忽略 build/ 目录下的所有文件 doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt