Git手册

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操作都需要输入用户名密码
$ 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 # local path
$ git clone git://github.com/schacon/grit.git mygrit --recursive # 递归拉取子module

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 删除本地分支

1
$ git branch -D develop # 删除本地develop分支

4.2 删除远程分支

1
$ git push origin :develop # 删除远程develop分支

4.3 远程分支已经删除,本地通过 git branch -a 还能看到

1
2
$ git remote show origin # 可以查看remote地址,远程分支,还有本地分支与之相对应关系等信息。
$ git remote prune origin # 删除本地那些远程仓库不存在的分支

5 合并分支

5.1 方式一 merge

1
2
$ git checkout master # 切换到 master
$ git merge develop # 合并devlop分支

merge 遇到冲突,先解决冲突,然后

1
2
$ git add <filename> # 添加已经解决冲突的文件
$ git commit # 此处不需要 -m 标签

5.2 方式二 rebase

1
2
3
4
5
$ git checkout develop # 切换到 develop
$ git rebase master # 变基到 master

## 以上两条命令等价于下面这条
$ git rebase master develop # git rebase [base-branch] [topic-branch]

然后回到 master 分支进行快速合并

1
2
$ git checkout master
$ git merge develop # 合并devlop分支

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
1
E---H'---I'---J'  topicA

5.3.3 可交互式变基

交互式变基意味着您有机会编辑被重基的提交。 您可以重新排序提交,并可以删除它们(清除坏的或不需要的补丁)

1
2
3
4
5
$ git rebase -i master # edit the current branch commit before merge into master

$ git rebase -i <after-this-commit> # Start it with the last commit you want to retain
$ git rebase -i HEAD~5 # edit the last 5 commits

然后根据 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 # 查看origin仓库信息
$ git fetch [remote-name]
$ git pull # git fetch && git merge
$ git push origin master
$ git remote rename origin paul # 重命名
$ git remote rm origin # 删除

0x05 Tags 标签

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 # push 所有本地标签

2 仅使用远程仓库 tags

1
$ git tag -l | xargs git tag -d && git fetch -t # 使用远程仓库 tags 并且删除本地 tags

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

img

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
作者

Dench

发布于

2020-02-08

更新于

2020-02-08

许可协议

CC BY-NC-SA 4.0

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×