Git操作指南

Git操作指南

整理的一些Git常用命令,以及进阶命令git rebase,从这里你可以学到基础的Git配置命令、分支管理、fetch指令、git撤销、状态查询、文档查询、文件暂存、差异比较、基本操作、git进阶之rebase

配置命令

列出当前配置

Git Bash/Shell
1
git config --list

列出Repository配置

Git Bash/Shell
1
git config --local --list

列出全局配置

Git Bash/Shell
1
git config --global --list

列出系统配置

Git Bash/Shell
1
git config --system --list

配置用户名

Git Bash/Shell
1
git config --global user.name "your name"

配置用户邮箱

Git Bash/Shell
1
git config --global user.email "youremail@github.com"

分支管理

查看本地分支

Git Bash/Shell
1
git branch

查看远程分支

Git Bash/Shell
1
git branch -r

查看本地和远程分支

Git Bash/Shell
1
git branch -a

从当前分支切换到其它分支

Git Bash/Shell
1
git checkout <branch-name>

创建并切换到新分支

Git Bash/Shell
1
git checkout -b <branch-name>

删除分支

Git Bash/Shell
1
git branch -d <branch-name>

当前分支与指定分支合并

Git Bash/Shell
1
git merge <branch-name>

查看哪些分支已经/没有合并到当前分支

Git Bash/Shell
1
2
git branch --merged
git branch --no-merged

查看各个分支最后一个提交对应的信息

Git Bash/Shell
1
git branch -v

删除远程分支

Git Bash/Shell
1
git push origin -d <branch-name>

重命名分支

Git Bash/Shell
1
git branch -m <oldbranch-name> <newbranch-name>

拉取远程分支并创建本地分支

Git Bash/Shell
1
2
3
git checkout -b 本地分支名 origin/远程分支名
or
git fetch origin <branch-name>:<local-branch-name>

fetch指令

将远程仓库的内容更新到本地

Git Bash/Shell
1
git fetch origin <branch-name>:<local-branch-name>
  • 一般而言,这个origin是远程主机名,一般默认就是origin。
  • branch-name 你要拉取的分支
  • local-branch-name 通常而言,就是你本地新建一个新分支,将origin下的某个分支代码下载到本地分支。

将某个远程主机的更新,全部取回本地

Git Bash/Shell
1
git fetch <远程主机名>

取回特定分支

Git Bash/Shell
1
git fetch <远程主机名> <分支名>

将某个分支的内容取回到本地的某个分支

Git Bash/Shell
1
git fetch origin :<local-branch-name>

git pull 和 git fetch的区别?

git撤销

撤销工作区修改

Git Bash/Shell
1
git checkout--

暂存区文件撤销(不覆盖工作区)

Git Bash/Shell
1
git reset HEAD

版本回退

git reset –(soft|mixed|hard) <HEAD~(num)> |

指令 作用范围
–hard 回退全部,包括HEAD,index,working,tree
–mixed 回退部分,包括HEAD,index
–soft 只回退HEAD

状态查询

查看状态

Git Bash/Shell
1
git status

查看历史操作记录

Git Bash/Shell
1
git reflog

查看日志

Git Bash/Shell
1
git log

文档查询

展示Git命令大纲

Git Bash/Shell
1
git help (--help)

展示Git命令大纲全部列表

Git Bash/Shell
1
git help -a

展示具体命令说明手册

Git Bash/Shell
1
git help

文件暂存

添加改动到stash

Git Bash/Shell
1
git stash sava -a "message"

删除暂存

Git Bash/Shell
1
git stash drop stash@{ID}

查看stash列表

Git Bash/Shell
1
git stash list

删除全部缓存

Git Bash/Shell
1
git stash clear

恢复改动

Git Bash/Shell
1
git stash pop stash@{ID}

差异比较

比较工作区与缓存区

Git Bash/Shell
1
git diff

比较缓存区与本地库最近一次commit内容

Git Bash/Shell
1
git diff --cached

比较工作区与本地最近一次commit内容

Git Bash/Shell
1
git diff HEAD

比较两个commit之间的差异

Git Bash/Shell
1
git diff

基本操作

创建本地仓库

Git Bash/Shell
1
git init

链接本地仓库与远程仓库

Git Bash/Shell
1
2
git remote add origin
origin默认是远端仓库别名url 可以使用https或者ssh的方式

检查配置信息

Git Bash/Shell
1
git config --list

Git user name and email

Git Bash/Shell
1
2
git config --global user.name "yourname"
git config --global user.email "youremail"

生成SSH秘钥

Git Bash/Shell
1
2
ssh-keygen -t rsa -C "youremail"
cd ~/.ssh 里面有一个文件名为id_rsa.pub, 把里面的内容复制到git库的我的SSHKEYS中

查看远端仓库信息

Git Bash/Shell
1
git remote -v

远端仓库重新命名

Git Bash/Shell
1
git remote rename old new

提交到缓存区

Git Bash/Shell
1
2
git add . 全部文件
git add 指定文件

提交到本地仓库

Git Bash/Shell
1
git commit -m "message"

提交到远程仓库

Git Bash/Shell
1
git push <远程主机名> <本地分支名>:<远程分支名>

git 进阶之rebase

Git commits历史是如何做到如此清爽的?

Rebase场景一:如何合并多次提交记录

  1. 合并最近的n次提交记录

    Git Bash/Shell
    1
    git rebase -i HEAD~n
  2. 进入vi编辑模式

    pick:保留该commit(缩写:p)

    reword:保留该commit,但我需要修改该commit的注释(缩写:r)

    edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)

    squash:将该commit和前一个commit合并(缩写:s)

    fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)

    exec:执行shell命令(缩写:x)

    drop:我要丢弃该commit(缩写:d)

  3. 如果保存的时候,出错

    JavaScript
    1
    error: cannot 'squash' without a previous commit

    注意不要合并先前提交的东西,也就是已经提交远程分支的纪录。

  4. 如果你异常退出了 vi 窗口

    Git Bash/Shell
    1
    git rebase --edit-todo

    这时候会一直处在这个编辑的模式里,我们可以回去继续编辑,修改完保存一下

    Git Bash/Shell
    1
    git rebase --continue
  5. 查看结果

    Git Bash/Shell
    1
    git log

Rebase场景二:分支合并

  1. 我们先从 master 分支切出一个 dev 分支,进行开发:

    Git Bash/Shell
    1
    git checkout -b feature
  2. 这时候,你的同事完成了一次 hotfix,并合并入了 master 分支,此时 master 已经领先于你的 feature 分支了

  3. 恰巧,我们想要同步 master 分支的改动,首先想到了 merge

  4. 让我们来试试 git rebase而不是使用merge

    Git Bash/Shell
    1
    git rebase master

    首先,git 会把 feature 分支里面的每个 commit 取消掉;
    其次,把上面的操作临时保存成 patch 文件,存在 .git/rebase 目录下;
    然后,把 feature 分支更新到最新的 master 分支;
    最后,把上面保存的 patch 文件应用到 feature 分支上;

    commit 记录我们可以看出来,feature 分支是基于 hotfix 合并后的 master ,自然而然的成为了最领先的分支,而且没有 mergecommit 记录,是不是感觉很舒服了。

  5. rebase 的过程中,也许会出现冲突 conflict。在这种情况,git 会停止 rebase 并会让你去解决冲突。在解决完冲突后,用 git add 命令去更新这些内容

    Git Bash/Shell
    1
    git rebase --continue

    这样 git 会继续应用余下的 patch 补丁文件。

  6. 在任何时候,我们都可以用 --abort 参数来终止 rebase 的行动,并且分支会回到 rebase 开始前的状态。

    Git Bash/Shell
    1
    git rebase —abort

如何配置多个提交账户?

git config user

假如你在 Github 上有个人项目,而公司项目存放在公司内网 gitlab 上,如何为这两种不同类型的项目配置不一样的提交用户呢?

Git 全局的用户配置文件存放在 ~/.gitconfig 中,我们可以通过以下命令设置全局默认的用户名和邮箱。

bash zsh
1
2
git config --global user.name "<Your Name>"
git config --global user.email "<Your Email>"

如果需要为某一个项目配置不同的用户,则可以进入到项目对应的目录下,使用以下命令。它会在项目根目录的 .git/config 文件中保存这些配置信息:

bash zsh
1
2
git config user.name "<Another Name>"
git config user.email "<Another Email>"

Conditional Includes

在 git 2.13 版本中,增加了 conditional includes 配置,可以创建多个 gitconfig 文件,并针对不同的根目录使用不同的配置文件。例如,以下全局配置文件 ~/.gitconfig 中包含以下用户配置信息,当项目 clone 在 ~/dev/ 目录下时,会自动使用另外一份配置文件:

1
2
3
4
5
[user]
name = Your Name
email = your_email@example.com
[includeIf "gitdir:~/dev/"]
path = .gitconfig-dev

以下是 ~/.gitconfig-dev 文件的配置:

1
2
3
[user]
name = Another Name
email = another_email@example.com

注意:强烈建议将 global user 配置为你的 Github ID,避免默认提交中有效用户信息的缺失,导致 Github contributions 不准确。同时,不设置为公司邮箱,可以避免邮箱信息泄露。

参考

https://juejin.im/post/6869519303864123399

http://jartto.wang/2018/12/11/git-rebase/

https://git-scm.com/book/zh/v2/

Something wrong with this article? Click here to submit your revision.

Vector Landscape Vectors by Vecteezy

作者

CrazyChenzi

发布于

2023-01-28

许可协议

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

×