1. 参考
  2. 设置 git config
    1. 显示config
    2. 修改config
    3. 删除config
    4. 创建Git仓库
  3. 提交文件
    1. 提交到暂存区
    2. 提交到本地仓库
    3. 提交到远程仓库
  4. 显示记录
  5. 比较文件差别
  6. 撤销
    1. 撤消暂存区文件(不还原工作区文件)
    2. 重新提交(commit)
  7. 还原文件
    1. 还原到暂存区版本
    2. 还原到最后一次commit
    3. 还原到以前的commit
      1. reset
      2. checkout
  8. 忽略文件
  9. 删除文件
    1. 彻底删除某个文件
  10. 分支
    1. 显示所有分支及当前所在分支
    2. 创建分支
    3. 切换分支
    4. 合并分支
      1. merge
      2. rebase
    5. 删除本地分支
    6. 删除远程分支
    7. 分支合并冲突
  11. 远程库
    1. 查看远程库
    2. 添加远程库
    3. 拉取远程库更新
      1. fetch
      2. pull
    4. 重命名远程库
    5. 删除远程库
    6. 推送到远程库

Git

开源的分布式版本控制系统

参考

廖雪峰 Git教程
Git 官方文档
介紹好用工具:BFG Repo-Cleaner

设置 git config

显示config

--list 打印设置

1
2
3
git config --list --style #查看系统设置
git config --list --global #查看当前用户设置
git config --list --local #查看当前所在仓库设置

--get [config name] 打印单个参数

1
2
3
4
#打印所有者邮箱
git config --get user.email
#打印所有者姓名
git config --get user.name

--local 当前所在项目
--global 当前用户(常用)
--system 系统设置
设置生效的优先级 local > global > system

修改config

git config 参数名 "参数值"

1
2
3
4
5
git config user.name "Aaron" 
# 等同于
git config --local user.name "Aaron"

git config --global user.name "Aaron"

删除config

git --unset 参数名

1
git config --local --unset user.name 

创建Git仓库

git init

提交文件

提交到暂存区

git add[filename]

1
2
3
git add README.md
# 提交所有被修改的文件到暂存区
git add .

注:不建议使用git add *

提交到本地仓库

git commit -m "commit explain"

1
git commit -m "add README.md"

提交到远程仓库

git push [repository name] [branch name]

1
2
git push origin master
git push backup dev

显示记录

git log 显示提交记录
git reflog 显示操作记录
git status 显示文件信息(未提交/已提交到缓存区等...)

比较文件差别

git diff 显示所有未提交到缓存区文件的修改
git diff --staged [filename] 比较缓存区文件与最后一次提交文件的区别

1
2
git add README.md
git diff --staged README.md

注 "git diff --staged"和"git diff --cached"一样

撤销

撤消暂存区文件(不还原工作区文件)

git reset HEAD [filename]

1
2
3
4
# 撤消所有提交到缓存区的文件
git reset HEAD
# 撤消提交到缓存区的README.md
git reset HEAD README.md

HEAD 指向当前操作的commit

重新提交(commit)

git commit --amend
当提交错误时,可用--amend将暂存区文件覆盖上次提交.

1
2
git add
git commit --amend

如果提交描述写错了,还可以用该命令修改
git commit --amend -m "commit info"

还原文件

还原到暂存区版本

文件被提交到暂存区之后,又对文件进行了修改.如果想还原到暂存区版本,使用命令
git checkout -- [filename]

1
2
git checkout -- .
git checkout -- README.md


当文件被提交到暂存区时,"checkout -- "恢复文件到暂存区版本
当文件没有被提交到缓存区,"checkout -- "恢复文件到上一次提交版本(commit)

还原到最后一次commit

git reset --hard HEAD [filename]

1
git reset --hard HEAD README.md

还原到以前的commit

reset

git reset --hard [edition hash]

1
2
3
4
5
6
7
8
9
10
11
# 退回到上一版本
git reset --hard HEAD^
# 等于
git reset --hard HEAD~1

# 退回到上上一版本
git reset --hard HEAD^^
# 等于
git reset --hard HEAD~2
# 退回到指定版本
git reset --hard 884168

  • --hard 还原本地文件,不加hard不会还原本地文件
  • 可用git log命令查看版本序号
  • Git使用哈希值作为文件索引

checkout

git checkout [edition hash]

1
git checkout HEAD^

区别 "checkout HEAD^"会创建临时分支(切换到其他分支不会保存),原分支不作任何改动.

忽略文件

在项目根目录下新建文件".gitignore",把需要忽略的文件写在里边

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 新建.gitignore
touch .gitignore

# 忽略node_modules目录
node_modules/
# 忽略跟目录下的node_modules目录
/node_modules/
// 或
node_modules/*
# 忽略所有名为test.md的文件
test.md
# 忽略根目录下的test.md
/test.md
# 忽略所有.md结尾的文件
*.md

如果更新".gitignore"前文件已被提交到缓存区,需先清除缓存区内的相应文件再提交

删除文件

git rm [file name]

1
2
git rm "README.md"
git commit -m "delete README.md"

注 不要使用"git add *"提交删除更改,应用"git add ."(个人在windows下测试)
"."和"*"的区别

彻底删除某个文件

bfg-repo-cleaner专门用于删除Git数据,使用前需安装java
官网

1
2
3
4
5
6
# 删除README.md
git clone --mirror git@github.com:Aaron-Bird/studyGit.git
java -jar bfg.jar --no-blob-protection --delete-files README.md studyGit.git
cd studyGit.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push

分支

显示所有分支及当前所在分支

git branch

创建分支

git branch [branch name]

1
git branch dev

新分支内文件和当前所在分支相同

切换分支

git checkout [branch name]

1
git checkout dev

返回上一分支
git checkout -

合并分支

merge

git merge [branch name]

1
2
# 合并dev分支到master,该命令需在master分支下输入
git merge dev

rebase

git rebase

删除本地分支

git branch -d [branch name]

1
git branch -d dev

如果分支有提交且未合并,需使用"-D"强制删除

1
git branch -D dev

删除远程分支

git push <远程名> :<分支名>

1
git push origin :dev

注意(:)号的位置,不要写成"git push origin: dev"

分支合并冲突

当文件在两个分支中进行了不同的修改时,会产生合并冲突

1
2
3
4
5
6
7
8
9
10
git checkout dev
echo "aaa" >> README.md ## 修改分支dev
git commit -m "write README.md"

git checkout master
echo "bbb" >> README.md 修改分支master
git commit -m "write README.md"

git merge dev #合并失败
# Automatic merge failed; fix conflicts and then commit the result.

合并失败后,Git会将冲突代码以下列形式标记

1
2
3
4
5
6
cat README.md
<<<<<<< HEAD
aaa
=======
bbb
>>>>>>> dev

手动修改代码后提交即可

1
2
git add README.md
git commit -m "merge dev"

查看合并分支
git log --graph --pretty=oneline --abbrev-commit

注 rebase的合并和merge类似

1
2
git add.
git rebase --continue

远程库

查看远程库

git remote
#显示仓库url
git remote -v

添加远程库

git remote add [repository name] [repository url]

1
git remote add origin git@github.com:Aaron-Bird/studyGit.git

拉取远程库更新

fetch

git fetch [remote name] [branch name]
和pull的区别是,fetch不会自动合并(merge)代码,相对pull更安全

1
2
3
4
5
6
7
8
# 拉取远程库所有分支的更新
git fetch origin
# 拉去分支master的更新
git fetch origin master
# 比较远程库和本地库的区别
git log -p master..origin/master
# 合并远程库(origin/master)到本地(master)
git merge origin/master

pull

git pull [repository name] [branch name]

1
git pull origin master

重命名远程库

git remote rename [old name] [new name]

1
2
# 重命名远程库origin为backup
git remote rename origin backup

删除远程库

git remote remove [repository name]

1
git remote remove origin 

推送到远程库

git push [repository name] [branch name]

1
git push origin master

可用"-r"强制推送代码到远程库

1
2
3
4
5
6
git push -r origin master
``

### clone
下载分支到本地
git clone [repository url]

git clone git@github.com:Aaron-Bird/studyGit.git

1
2
3
注 clone的库会自动命名为origin

使用clone获取远程库,可用"branch -r"查看所有远程分支

git branch -v
#以origin/dev为基础,创建dev分支

1
git branch dev origin/dev