记录一些最常用的命令(从上往下使用频率依次降低),当然,这里只是吾辈个人的,其他功能可能暂时还没用到呢

详细的 git 相关知识强烈推荐 Pro Gitopen in new window

基本命令

关键词命令格式命令解释命令示例 释
initgit init为当前目录初始化 git 本地仓库
addgit add [要追踪的文件/路径]添加到 git 跟踪git add -A
commitgit commit [路径] [选项] [提交说明]提交当前的修改内容git commit -a -m "提交全部的修改"
remotegit remote [选项] [远程仓库名]操作 git 远程仓库git remote
git remote add origin https://github.com/rxliuli/rxliuli.github.io.git
git remote show origin
git remote remove origin
pushgit push [远程别名] [远程分支]推送本地修改到远程git push origin master
pullgit pull [远程别名] [远程分支]拉取远程修改到本地git pull origin master
statusgit status查看本地仓库的状态,以此得知添加和修改的文件
clonegit clone [远程仓库地址]克隆一个远程仓库到本地,这里和 pull 不同点在于本地不存在要克隆的仓库git clone https://github.com/rxliuli/rxliuli.github.io.git
loggit log [选项]查看 git 日志git log
revertgit revert [提交记录 hash]撤销掉指定提交git revert ab1c2d2
resetgit reset [提交记录 hash]重置到某次提交上,和上面不一样的是不会添加新的提交记录,而是删除已有的提交记录git reset ab1c2d2
git reset HEAD~[N 回退次数]回退最近几次的提交, N 为几就回退几次git reset HEAD~1
branchgit branch [分支]git 分支(强大而又复杂的功能)git branch dev
git branch
git branch dev -D
checkoutgit checkout [分支名]切换当前分支(分支之间不共享修改)git checkout master
git checkout origin/dev -b dev
mergegit merge [选项]合并其他分支的修改到当前分支上git merge dev
git merge origin/master --allow-unrelated-histories
pushgit push [远程仓库名] :[分支名]删除掉指定的远程分支(仓库还在,只是删除分支)git push origin :dev
stashgit stash暂存本地更改
git stash list查看所有暂存更改
git stash apply [index]重新应用指定暂存更改git stash apply
git stash drop [index]删除掉指定的暂存更改git stash drop

复合命令

撤销掉本地所有的修改

命令

git add -A && git stash && git stash drop
1

解释

  1. 添加所有更改到 git 追踪中(如果没有被忽略的话)
  2. 添加所有本地更改到暂存区域中
  3. 删除掉刚添加的最新暂存更改

应用场景修改了一些文件但又没有提交,突然发现有问题,想把它们全删除了重来,或者全部回到上次提交,先把这些修改暂存起来(不加最后一条命令)

区分文件名大小写

命令

git config core.ignorecase false
1

解释 Windows 下默认不区分文件名大小写,所以需要特别设置一下。

git push 强制推送

命令

git push -f
1

解释

强制推送到远程分支,即便是远程包含本地不存在的提交

忽略已经跟踪的文件的提交

参考:怎样让 Git 忽略当前已经更改的文件open in new window

忽略修改

git update-index --assume-unchanged <files>
1

取消这种设定

git update-index --no-assume-unchanged <files>
1

从远端拉取分支

参考:git 获取远程服务器的指定分支open in new window

命令

git checkout -b [本地分支名(不存在)] [远程分支名]
1

示例

git checkout -b dev origin/dev
1

忽略已提交的文件修改

参考:git 如何忽略已经提交的文件 (.gitignore 文件无效)open in new window

主要用于忽略一些本地修改的文件但又不希望提交,同时也不希望添加到 .gitignore 中将之从云端排除的方式。

git update-index --assume-unchanged [file-pattern]
1

git 删除远程 tag

显示本地 tag

git tag
1

删除本地 tag

git tag -d Remote_Systems_Operation
1

用 push, 删除远程 tag

git push origin :refs/tags/Remote_Systems_Operation
1

删除远程分支

git branch -r -d origin/branch-name
git push origin :branch-name
1
2

两个 git 仓库合并

现在有两个仓库 kktjs/kktopen in new windowkktjs/kkt-nextopen in new window 我们需要将 kkt-next 仓库合并到 kkt 并保留 kkt-next 的所有提交内容。

# 1. 克隆主仓库代码
git clone [email protected]:kktjs/kkt.git

# 2. 将 kkt-next 作为远程仓库,添加到 kkt 中,设置别名为 other
git remote add other [email protected]:kktjs/kkt-next.git

# 3. 从 kkt-next 仓库中拉取数据到本仓库
git fetch other

# 4. 将 kkt-next 仓库拉取的 master 分支作为新分支 checkout 到本地,新分支名设定为 dev
git checkout -b dev other/master

# 5. 切换回 kkt 的 master 分支
git checkout master

# 6. 将 dev 合并入 kkt 的 master 分支
git merge dev

# 如果第 6 步报错 `fatal: refusing to merge unrelated histories`
# 请执行下面命令 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
git merge dev --allow-unrelated-histories
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

JetBrains IDE 提供了非常好用的冲突合并工具

在合并时有可能两个分支对同一个文件都做了修改,这时需要解决冲突,对文本文件来说很简单,根据需要对冲突的位置进行处理就可以。对于二进制文件,需要用到如下命令:

git checkout --theirs YOUR_BINARY_FILES     # 保留需要合并进来的分支的修改
git checkout --ours YOUR_BINARY_FILES       # 保留自己的修改
git add YOUR_BINARY_FILES
1
2
3

参考: https://segmentfault.com/a/1190000021919753open in new window

在 git 目录中忽略 git 子模块的所有变更

参考 git submoduleopen in new window

# .gitmodules
[submodule "examples/blog-hexo-example/themes/next"]
  path = examples/blog-hexo-example/themes/next
  url = https://github.com/theme-next/hexo-theme-next
  ignore = all
1
2
3
4
5

git 提交时忽略 hooks

添加 --no-verify 参数即可

git commit --no-verify
1

Git 错误 Reset 恢复

  1. 找到使用 git reset 之前的最后一次提交的 commit id

    # 查看 git 记录的所有操作,包括回退操作也会记录
    git reflog
    
    1
    2
  2. 使用 git reset --hard 回退

    # 回退到指定提交,但不会将之后提交混入到未提交的内容
    git reset --hard dd256c7d66ad2e9671cbd47650ffddc4267ca7d5
    
    1
    2
  3. 使用 git log 检查最后一次提交是否恢复

    # 这时可以看到最后一次提交已经恢复了
    git log
    
    1
    2

参考: 执行了 git reset,还有办法取消吗?open in new window

Git 高级合并

前端想要调整项目组织将之前的项目放到 monorepo 中,所以需要使用 git 将之前的项目合并到新项目的指定目录中,同时保留所有记录。

主要依赖功能 高级合并 => 子树合并open in new window,同时参考错误解决方案 The “fatal: refusing to merge unrelated histories” Git erroropen in new window

git remote add rack_remote https://github.com/rack/rack
git fetch rack_remote --no-tags
git checkout -b rack_branch rack_remote/master
git checkout master
git read-tree --prefix=rack/ -u rack_branch
git merge --squash -s recursive -Xsubtree=rack rack_branch --allow-unrelated-histories
1
2
3
4
5
6

系统更新后 git 错误

需要修改 ~/.ssh/config 配置文件

Host *
  ServerAliveInterval 10
  HostKeyAlgorithms +ssh-rsa
  PubkeyAcceptedKeyTypes +ssh-rsa
1
2
3
4

关联本地与远端分支

当你 git push 时可能会提示需要关联,基本上复制提示的命令即可。下面是关联本地与远端的 master 分支的方法

git push --set-upstream origin master
1

之后便可以直接 git push 推送代码了

git log 设置日期格式

默认 git log 使用的日期格式对于国内并不方面查看,但 git 支持设置格式化格式。

git config --global log.date format:"%Y-%m-%d %H:%M:%S"
1

参考:Git log 修改时间格式open in new window