前言
记录日常中常用的Git命令
安装
Git官网
| Git官网
Git下载
| Git下载
配置
配置user.name
和user.email
git config --global user.name 'your_name'
git cofig --global user.email 'your_email@domain.com'
# 将默认编辑器设置为vim
git config --global core.editor vim
作用域
代码语言:javascript复制# 某个仓库有效(默认)
git config --local
# 全局有效(当前用户所有仓库有效)
git config --global
# 系统所有登陆用户有效
git config --system
代码语言:javascript复制显示config配置
# 查看本地配置
git config --list --local
# 查看全局配置
git config --list --global
# 查看系统配置
git config --list --system
创建仓库
代码语言:javascript复制cd your_project
git init
git config --global user.name 'your_name'
git cofig --global user.email 'your_email@domain.com'
git remote add origin <git addr>
git add -A
git commit -m "add file"
git push
目录结构
代码语言:javascript复制.git
├─ COMMIT_EDITMSG
├─ FETCH_HEAD
├─ HEAD #该文件表示当前本地签出的分支,例如存储的值:ref: refs/heads/master
├─ ORIG_HEAD
├─ config
├─ description
├─ hooks
│ ├─ applypatch-msg.sample
│ ├─ commit-msg.sample
│ ├─ fsmonitor-watchman.sample
│ ├─ post-update.sample
│ ├─ pre-applypatch.sample
│ ├─ pre-commit.sample
│ ├─ pre-push.sample
│ ├─ pre-rebase.sample
│ ├─ pre-receive.sample
│ ├─ prepare-commit-msg.sample
│ └─ update.sample
├─ index #存储缓冲区(GitExtensions中的stage)的内容,内容包括它指向的文件的时间戳、文件名、sha1值等;(git三大区域:工作区,暂存区,历史记录区)
├─ info
│ ├─ exclude
│ └─ refs
├─ logs
│ ├─ HEAD
│ └─ refs
│ ├─ heads
│ ├─ remotes
│ └─ stash
├─ objects #存储对象的目录,本地仓库,git中对象分为三种:commit对象,tree对象(多叉树),blob对象
│ ├─ 06
│ │ └─ abbb19400a205bdbd1dc0a28b986323fc8b808
│ ├─ 0e
│ │ └─ 5d9122f24db7db88b7688759bf457be74e8643
│ ├─ 16
│ │ └─ 89c24264c1fde08df4773db3cfbf6316d7e2b3
│ ├─ 2c
│ │ └─ 936a4ca60dd5c8f4ceeb9fede83a2c2f2c69b5
│ ├─ 48
│ │ └─ 0be438bab34a5361d8949f690a346973b8eb79
│ ├─ 72
│ │ └─ 7c5abd67dfeb49ee214b6a112445fbb550d3c5
│ ├─ bd
│ │ └─ 3441fa796371e5f796a1d522f8052b763ad533
│ ├─ f1
│ │ └─ 894b05a9021dded510f71fef2be2cfb9864db6
│ ├─ info
│ │ └─ packs
│ └─ pack
│ ├─ pack-76de1ecd79b2e31879a027b482c07377610a8bd6.idx
│ └─ pack-76de1ecd79b2e31879a027b482c07377610a8bd6.pack
├─ packed-refs
└─ refs #存储指向branch的最近一次commit对象的指针,也就是commit对象的sha-1值(就是hash值,sha-1是一种散列算法),refs的目录下包括以下目录(git init后并没有remotes和stash,需要有从remote地址中pull code等交互性操作才会出现remotes目录,stash文件则是做了stash操作才会出现):
├─ heads
│ ├─ dev
│ ├─ master
│ └─ tb-customer
├─ remotes
│ └─ origin
└─ stash
命令详解
add
代码语言:javascript复制# 将工作空间修改和删除的文件添加到暂存区
git add -u
# 将工作空间新增和被修改的文件添加的暂存区
git add .
# 将工作空间新增、修改和删除的文件添加到暂存区
git add -A
mv
代码语言:javascript复制# 修改文件名称
git mv <old_name> <new_name>
rm
代码语言:javascript复制# 删除文件
git rm <file_name>
log
代码语言:javascript复制# 查看单行的简洁日志
git log --oneline
# 查看最近2条简洁日志
git log --oneline -n4
git log --oneline -4
# 查看所有分支的历史日志
git log --all
# 以图形化展示历史日志
git log --all --graph
# 以图形化展示所有分支的最近4条简洁日志
git log --all --oneline -4 --graph
# 在网页端查看git log命令文档
git help --web log
# 在GUI界面查看
gitk --all
commit
代码语言:javascript复制# 修改上一次提交commit信息
git commit --amend
# 修改指定commit信息
git rebase -i <commit_id>
r <修改commit信息>
p <保留commit信息>
# 把连续多个commit合并成一个
git rebase -i <last_commit_id>
p <需保留的cmmit信息>
s <需合并到上一个commit信息>
# 把间隔的commit合并成一个
git rebase -i <last_commit_id>
p <需保留的commit信息>
s <把需要合并的commit的移动到需要保留的commit下面并选择squash策略>
代码语言:javascript复制rebase策略
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.
diff
代码语言:javascript复制# 比较暂存区和HEAD所含文件差异
git diff --cached
git diff --staged
# 比较工作区和暂存区所含文件差异
git diff
# 比较工作去和暂存区指定文件差异(可比较多个文件)
git diff -- <file_name_1> <file_name_2>
# 比较两个commit之间的差别
git diff <commit_id_1> <commit_id_2>
# 比较两个commit之间的指定文件差别
git diff <commit_id_1> <commit_id_2> -- <file_name>
reset
代码语言:javascript复制# 将暂存区恢复成和HEAD一样
git reset HEAD
# 将暂存区指定文件恢复成和HEAD一样(可多个文件)
git reset HEAD -- <file_name_1> <file_name_2>
# 将暂存区恢复到指定的commit
git reset --hard <commit_id>
# 将指定文件的工作区恢复成和暂存区一样
git checkout -- <file_name>
git restore -- <file_name>
branch
代码语言:javascript复制# 查看本地所有分支
git branch -v
# 删除指定分支
git branch -d <branch_name>
# 强制删除指定分支
git branch -D <branch_name>
checkout
代码语言:javascript复制# 创建新的分支
git checkout -b <branch_name>
# 切换分支
git checkout <branch_name>
git switch <branch_name>
stash
代码语言:javascript复制# 存储当前修改
git stash
# 查看stash列表
git stash list
# 恢复之前存储内容(保留stash信息)
git stash apply
# 恢复之前存储内容(删除stash信息)
git stash pop
remote
代码语言:javascript复制# 添加远程分支(一般使用智能协议[http/https|ssh])
git remote add <local_barnch_name> <remote_address>
# 查看本地分支
git remote -v
# 查看所有分支
git remote -va
fetch
代码语言:javascript复制# 拉取远程所有分支
git fetch --all
# 拉取指定分支
git fetch <local_branch_name> <remote_branch_name>
#
merge
代码语言:javascript复制# 合并和远程不相关的分支
git merge --allow-unrelated-histories <remote_branch_name>
# 图形化合并界面
git mergetool