0%

记录一些 Git 的命令

Sourcetree 莫名无法登陆 Atlassian 账号之后,打算尝试用命令行操作 Git,但是用习惯了 GUI,Git 命令都快忘的一干二净了。于是又打开廖雪峰老师的 Git 教程,准备再仔细过一遍。同时结合其他 Git 教程,把 Git 的基本概念、使用再重新梳理一遍。这里就记录一些常用的 Git 命令。

1
2
3
4
5
6
// 设置全局的用户名和邮箱
$ git config --global user.name "<name>"
$ git config --global user.email "<email address>"

// 让 Git 输出语句显示颜色
$ git config --global color.ui true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 创建版本库
$ git init

// 当前 Git 状态
$ git status

// 添加指定文件到暂存区,包括新增和修改
$ git add <file>

// 添加工作区所有修改到暂存区,包括新增、修改、删除
$ git add -A

// 提交暂存区内容到当前分支
$ git commit -m "<descriptive message>"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 工作区和暂存区的不同
$ git diff
$ git diff <file>

// 工作区和当前分支的不同
$ git diff HEAD
$ git diff HEAD <file>

// 暂存区和当前分支的不同
$ git diff --staged
$ git diff --staged <file>

// 查看历史提交记录
$ git log

// 这几个参数的意义:--graph 显示分支合并图,--pretty=oneline 只显示一行简化信息 --abbrev-commit 提交的版本号只显示前面 7 位
$ git log --graph --pretty=oneline --abbrev-commit

// 查看每一次命令
$ git reflog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 回到上一个提交的版本,工作区保持原状
$ git reset HEAD^

// 回到上一个提交的版本,工作区和暂存区都刷新
$ git reset --hard HEAD^

// reset 有三种情况
// --mixed:会影响到暂存区和历史记录区,也是默认选项
// --soft:只影响历史记录区
// --hard:影响工作区、暂存区和历史记录区

// 将工作区修改撤销到上次 add 或者 commit 时的状态,如果文件名和分支名没有冲突 -- 可以省略
$ git checkout -- <file>

// 如果已经添加到暂存区,希望恢复到上次 commit 的状态,可先进行这一步将暂存区内容撤销
$ git reset HEAD <file>
1
2
3
4
5
// 如果文件被删除,这个命令将这个改变添加到暂存区
$ git rm <file>

// 将暂存区中这个文件删除
$ git rm --cached <file>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 为本地已有仓库添加远程仓库,远程仓库名为 origin (一个仓库可以添加多个远程仓库)
$ git remote add origin git@github.com:michaelliao/learngit.git

// 查看远程仓库
$ git remote

// 查看远程仓库详细信息,可以查看是否有 push 权限
git remote -v

// 将 master 分支推送到远程仓库 origin
$ git push origin master
// 将 dev 分支推送到远程仓库 origin
$ git push origin dev

// 第一次推送时,使用 -u 可以把本地的 master 分支和远程的 master 分支关联起来,以后就可以省略
$ git push -u origin master

// 将一个远程仓库复制到本地
$ git clone <url>

// 删除一个关联的远程仓库
$ git remote remove origin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// 查看分支
$ git branch

// 新建分支
$ git branch <branch-name>

// 切换到分支
$ git checkout <branch-name>
// 切换到分支(新)
$ git switch master

// 新建并切换到分支
$ git checkout -b <branch-name>
// 新建并切换到分支(新)
$ git switch -c dev

// 将指定分支合并到当前分支
$ git merge <branch-name>

// 变基(主要用于将公共分支的变更合并的 feature 分支)
$ git rebase <branch-name>

// 删除指定分支
$ git branch -d <branch-name>

// 如果 dev 分支修改过程中,master 分支从没有修改过,那么 Git 默认会使用 Fast forward 模式合并,不会产生新的 commit,而是直接把 master 的指针指向 dev 分支最后的 commit 上,我们并不会在分支历史中看到分支信息,如果一定要看到,可以指定非 Fast forward 模式合并,这种模式合并,一定会新产生一个 commit
// 使用非 Fast forward 模式合并,附带 commit 的信息
$ git merge --no-ff -m "merge with no-ff" dev

// 强行删除指定分支,即使其还没有合并到主分支
$ git branch -D feature-vulcan

// 从远程仓库拉去 dev 分支到本地
$ git checkout -b dev origin/dev

// 将当前分支远程仓库最新的内容拉取下来
$ git pull

// 更改远程分区的 HEAD 到 develop 分支
git remote set-head origin develop

// 将本地的 dev 分支与远端的 dev 分支做关联(?)
$ git branch --set-upstream-to=origin/dev dev
// 推送本地新建的 dev 分支到远端
git push --set-upstream origin dev
1
2
3
4
5
6
7
8
9
10
11
12
13
(本段摘自廖雪峰 Git 教程)
多人协作的工作模式通常是这样:

首先,可以试图用git push origin branch-name推送自己的修改;

如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

如果合并有冲突,则解决冲突,并在本地提交;

没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

// 这部分不一定对,有的已经废弃了
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to=origin/dev dev。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 暂时缓存当前工作区
$ git stash

// 查看 stash 列表
$ git stash list

// 恢复 stash 内容,但是 stash 并不删除
$ git stash apply stash@{0}

// 删除 stash 内容
$ git stash drop

// 恢复 stash 最近的内容,并删除
$ git stash pop

// 将某个提交的变化复制到当前分支
$ git cherry-pick 4c805e2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 查看所有标签
$ git tag

// 为当前分支最新提交打上标签
$ git tag v1.0

// 为历史提交中的某次提交打上标签
$ git tag v0.9 <commit id>

// 查看指定标签的信息
$ git show <tag name>

// 创建标签的过程中添加标签的说明
$ git tag -a v0.1 -m "version 0.1 released" 3628164

// 删除指定标签
$ git tag -d <tag name>

// 推送一个本地标签
$ git push origin <tag name>

// 推送全部未推送过的本地标签
$ git push origin --tags

// 删除一个远程标签
$ git push origin :refs/tags/<tag name>
1
2
3
4
5
6
7
8
// 给常用 Git 命令设置别名,以快捷输入,这个依然是保存在家目录的 .gitconfig 文件中
$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
$ git config --global alias.unstage 'reset HEAD'
$ git config --global alias.last 'log -1'
$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

链接:

廖雪峰的 Git 教程:Git 入门最好的教程。

Git Flow:Git Flow 的原文,里面的图片一目了然。

GitHub Git Cheat Sheet:各种 Git 基本操作的命令。

工作流一目了然,看小姐姐用动图展示 10 大 Git 命令:一些 Git 操作的动图解释。

面试中的那些 Git 问题 - 基础部分