目录
  1. 1. 前言
  2. 2. 初始化
  3. 3. 配置
  4. 4. 基本操作
    1. 4.1. git status
    2. 4.2. git add
    3. 4.3. git commit
    4. 4.4. git rm
    5. 4.5. git diff
  5. 5. 分支管理
    1. 5.1. 查看分支
    2. 5.2. 新建分支
    3. 5.3. 切换分支
    4. 5.4. 合并分支
    5. 5.5. 删除分支
  6. 6. 查看历史及版本操作
    1. 6.1. 历史记录
    2. 6.2. 版本操作
  7. 7. 远程仓库
    1. 7.1. 初始化
    2. 7.2. ssh key
    3. 7.3. 推送
    4. 7.4. 下载
  8. 8. 问题总结
    1. 8.1. 冲突解决
      1. 8.1.1. 场景一:本地和远程在同个 HEAD 后都有 commit
      2. 8.1.2. 场景二:本地中途拉取更新
    2. 8.2. GitHub commit 回退删除
    3. 8.3. 删除中间不必要 commit 。
Git 指北 - 常用指令

更新日志:
  2019-11-27 更新问题总结章节
  2019-04-28 文章发表


前言

Git 是一个分布式版本控制系统,不同类型的版本控制软件还有 svn,mercurial,vss,SourceAnywhere 等。

GitHub 是一个集成了 git 的服务。 它可以以网页或者客户端的形式,帮助用户把 git 本地的数据提交到远程的服务器里。

Git 和 GitHub 在版本控制方面十分好用,指令集也高达几百条,这里总结一些平时常用指令。

初始化

  • git init : 初始化当前目录;
  • git init [name] : 指定目录初始化;
  • git clone [url] : 克隆项目;
1
2
3
4
5
6
7
8
# 当前目录初始化
$ git init

# 指定目录初始化
$ git init newrepo

# 当前目录克隆项目
$ git clone https://github.com/VincentTV/before-after-slider.git

配置

  • git config user.name [name] : 项目配置,用户名;
  • git config user.email [email] : 项目配置,用户邮箱;
  • git config --global user.name [name] : 全局配置,用户名;
  • git config --global user.email [email] : 全局配置,用户邮箱;
  • git config --list : 查看当前 git 配置;
1
2
3
4
5
6
7
8
9
10
# 项目配置, 配置文件 .git/config
$ git config user.name "Vincent F0ng"
$ git config user.email "vincefong1018@gmail.com"

# 全局配置,配置文件 ~/.gitconfig
$ git config --global user.name "Vincent F0ng"
$ git config --global user.email "vincefong1018@gmail.com"

# 显示当前的Git配置
$ git config --list

基本操作

git status

该命令用于查看项目的当前状态。

1
2
3
4
5
# 工作区状态
$ git status

# 加 -s 简短结果输出
$ git status -s

git add

该命令可将该文件添加到缓存区。

  • git add [file/dir] : 添加文件或目录到缓存区;
  • git add .git add -A : 添加所有文件
1
2
3
4
5
6
7
8
9
# 添加指定文件到暂存区
$ git add [file1] [file2] ...

# 添加指定目录到暂存区,包括子目录
$ git add [dir]

# 添加当前目录的所有文件到暂存区
$ git add .
$ git add -A

git commit

该命令可将提交暂存区到仓库区。

  • git commit -m [message] : 提交暂存区所有文件;
  • git commit [file1] [file2] -m [message] : 指定文件提交;
  • git commit -a -m [message] : 直接从工作区提交到仓库区;
1
2
3
4
5
6
7
8
# 提交暂存区到仓库区
$ git commit -m "提交信息"

# 提交暂存区的指定文件到仓库区
$ git commit file1.js file2.js -m "提交信息"

# 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a -m "提交信息"

git rm

该命令可将文件从工作区、缓存区移除。

如果只是简单地从工作目录中手动删除文件,运行 git status 时就会有 Changes not staged for commit 的提示。

1
2
3
4
5
6
7
8
# 从已跟踪文件清单中移除
$ git rm [file]

# 已提交暂存区,则必须要用强制删除 -f
$ git rm -f [file]

# 移除暂存区,并保留在工作区中
$ git rm --cached [file]

git diff

该命令显示已写入缓存与已修改但尚未写入缓存的改动的区别。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 显示暂存区和工作区的差异
$ git diff

# 显示暂存区和上一个commit的差异
$ git diff --cached [file]

# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD

# 显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]

# 显示今天你写了多少行代码
$ git diff --shortstat "@{0 day ago}"

分支管理

  • git branch
  • git checkout
  • git merge

查看分支

1
2
3
4
5
6
7
8
# 列出所有本地分支
$ git branch

# 列出所有远程分支
$ git branch -r

# 列出所有本地分支和远程分支
$ git branch -a

新建分支

1
2
3
4
5
# 新建一个分支
$ git branch [branch-name]

# 新建一个分支,并切换到该分支
$ git checkout -b [branch]

切换分支

1
2
3
4
5
# 切换到指定分支,并更新工作区
$ git checkout [branch-name]

# 切换到上一个分支
$ git checkout -

合并分支

1
2
3
4
5
# 合并指定分支到当前分支
$ git merge [branch]

# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]

删除分支

1
2
3
4
5
6
# 删除分支
$ git branch -d [branch-name]

# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

查看历史及版本操作

历史记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 显示当前分支的版本历史
$ git log

# 显示当前分支的历史记录的简洁的版本
# 可添加 --reverse 参数来逆向显示
$ git log --oneline

# 显示commit历史,以及每次commit发生变更的文件
$ git log --stat

# 搜索提交历史,根据关键词
$ git log -S [keyword]

# 显示最近几次版本历史
$ git reglog

版本操作

1
2
3
4
5
6
7
8
# 版本操作
$ git reset --hard [HEAD值]

# 只能回退,一个^代表一个版本
$ git reset --hard HEAD^

# 只能回退,数字代表几个版本
$ git reset --hard HEAD~2

远程仓库

初始化

  • git remote -v : 查看;
  • git remote add [remote-name] [url] : 查看;
1
2
3
4
5
# 查看
$ git remote -v

# 初始化
$ git remote add origin https://github.com/VincentTV/before-after-slider.git

ssh key

创建公钥(需先配置全局用户
添加密钥在 push 时可以不用密码验证,也可使用 ssh 关联远程仓库。

  • ssh-keygen -t rsa : 生成密钥;
  • ssh-keygen -t rsa -C [email-address] : 可在密钥中添加邮箱信息;

生成的密钥在用户根目录下的 ~/.ssh 目录中,id_rsa为你的私钥(不要随便给别人),id_rsa.pub为你的公钥

1
2
3
4
5
6
$ cd ~
$ ssh-keygen -t rsa
$ cd .ssh
$ cat id_rsa.pub

# 创建密钥->复制公钥

Github 添加密钥
github->settings->SSH and GPGkeys->new ssh key->输入公钥


推送

1
$ git push [remote-name] [branch-name]

下载

1
2
3
4
5
6
7
8
9
10
11
# 抓取远程文件,不改动本地工作区文件
$ git fetch [remoteName] [BranchName]

# 切换抓取的远程分支
$ git checkout [remoteName/BranchName]

# 合并
$ git merge [remoteName/BranchName]

# 抓取并合并,相当于执行了 fetch 和 merge
$ git pull [remoteName] [BranchName]

问题总结

冲突解决

场景一:本地和远程在同个 HEAD 后都有 commit

场景说明:A 与 B 同时操作了同个 HEAD,无论谁先 push 了代码到远程仓库,后者 git pullpush 可能产生如下两种状况;

  • 直接先 git pull
  1. 两者修改地方不是同一处代码时,会自动合并;
merge 自动合并信息

git pull 会让输入 commit 信息,相应 log 也会多出一条 commit 信息。

git log 查看
  1. 两者修改代码冲突时,手动解决冲突文件,相应代码位置会出现冲突解决选项(VScode 环境)
merge冲突手动修改

场景二:本地中途拉取更新

场景说明:本地修改代码,但并未完成时想拉取远程的更新。直接 git pull 会出现如下提示;

git pull 失败

方法一:本地直接 commit 后,参考场景一;
方法二:代码未完成,并不想提交,可使用 git stash 缓存修改的代码;

  • git stash 缓存工作区修改;
  • git stash list 查看缓存;
  • git stash pop 提取缓存;
  • git stash clear 清除缓存;

所以可操作:git stash => git pull => git stash pop

git stash-->git pull-->git stash pop

同样,代码不冲突,会自动合并,如果出现代码冲突,会进入冲突解决状态:

merge 冲突手动修改

GitHub commit 回退删除

放弃修改,本地回退后强制提交 GitHub。

  1. 本地回退
1
$ git reset --hard [HEAD]
  1. 本地文件修改后,强制提交
1
$ git push [remoteName] HEAD --force

删除中间不必要 commit 。

场景说明:commit A => B => C,删除 B 达到 commit 记录只有 A=>C。

  1. 本地回退到 A
1
git reset --hard [HEAD]
  1. git cherry-pick [HEAD] 工作区获取最新 C 代码,代码冲突时需要手动解决冲突。
1
git cherry-pick [HEAD]
  1. git addgit commit 后强制提交。
1
git push [remoteName] HEAD --force

此时查看 git log 就只有 A 和最后一次的 commit 了。


文章作者: Vincent F0ng
文章链接: https://vincef0ng.cn/post/git-github/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Vincent F0ng
请喝奶茶
  • 微信
  • 支付宝
领红包

评论(支持Markdown)