Git Cheatsheet & Troubleshooting

常用功能

使用 PAT (Personal Access Token) 访问 repo

这样就不用每次都输入密码了

不过默认会使用本地账户, 有些时候我们可能不希望用这个账, 那么就可以通过 设置 Committer 进行账户设置

记住密码

主要是要打开这个文件: /.git/config (这个文件默认隐藏)

在这个文件末端加上这么几行:

/.git/config:

1
2
[credential]
helper = store

以后输入密码之后就会记住了

/.git/config:

设置 Committer

1
2
3
[user]
name = John Doe
email = email@email.com

常用命令

Git 命令速查

1
2
3
4
git add .                                 将所有改动放进暂存区 (注意最后输入了一个点的符号)
git commit -m "描述" 提交并附带概要信息
git pull 从远程仓库拉去代码
git push 推送代码到远程仓库 (master 分支)

git push

1
git push --force                              一般如果 revert 了的话重新 push 就可能遇到 reject 那么就使用 --force

git commit

1
2
3
git commit -m "{msg}" --no-verify           跳过 pre-commit 请求 直接 commit
git commit --amend -m "{msg}" 修改最后一次 commit 的 msg
git commit --amend -m "{msg}" --no-verify 如果 commit 使用了 `--no-verify` 那么修改 commit 也要使用

git merge

1
2
git merge                               Merge 之后会生成一段 merge 的 log, 记得要 git commit 然后 push 一下才会有变化
git merge --abort 退出当前 merge 并还原

git stash

1
2
3
4
5
6
git stash
git stash pop
git stash list
git stash apply [stash@{X}]
git stash whow [stash@{X}]
git stash drop [-q| --quiet] [stash@{X}]

Partial Stash

1
git stash save -p "my commit message"       将部分文件 stash, 需要一个一个决定是否 stash

然后输入关键字逐个决定是否 stash:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
y - stash this hunk
n - do not stash this hunk
q - quit; do not stash this hunk or any of the remaining ones
a - stash this hunk and all later hunks in the file
d - do not stash this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

git checkout

1
2
git checkout {branch name}                  切换本地分支 (如果没有的话就新建分支)
git checkout -b {branch name}

git pull/fetch

1
2
git pull origin {remote branch name}        fetch 并且 merge 远程分支
git fetch origin {remote branch name} 仅仅 fetch 远程分支

git branch

1
2
3
git branch {bch name}                 直接创建本地分支                                                       
git branch -a 查看所有的分支
git branch -r 查看远程所有分支

git reset

1
2
3
4
git reset {commit}                    Reset 到某个 commit, 文件不变动                                                          
如果某一步 commit 错误就用这个
不要用 --hard
git reset {commit} --hard Reset 到某个 commit, 文件也变成对应的 version

git diff

1
2
3
4
git diff                                  CLI 显示对应的 diff                 
git diff {commit1} {commit2} CLI 显示两个 commit 之间的 diff
git diff > 123.diff 将对应的未 commit 的内容 diff 输出到 123.diff
git apply 123.diff 将 123.diff 的内容提交回当前分支, 如果其中一个文件失败则回退

git assume-unchanged

对于单个文件应用

这个用法的缺陷就是一次只能选一个文件.

1
2
git update-index --assume-unchanged /path/to/file         忽略跟踪某个特定文件, 特别是 windows 下面 package. json 的临时修改每次都要 stash                           
git update-index --no-assume-unchanged /path/to/file 重新开始跟踪某个特定文件

对应文件夹应用

不包含子文件夹的方式

这个方式不包含子文件夹.

1
2
cd 到想要忽略的文件夹. 
ls | xargs -l git update-index --assume-unchanged
包含子文件夹的方式
1
git ls-files -z YOURFOLDER/ | xargs -0 git update-index --assume-unchanged

git rename

1
git mv "原文件名" "新文件名"                                修改文件名, 这样 commit 里面就不会出现一条多余的删除和添加.

git cherry-pick

1
2
3
4
5
6
git cherry-pick {commit id}                             
cherry pick 某个特定 commit, 这个就是将 commit 的修改直接叠在当前分支上, 不进行任何 rebase
git cherry-pick {commit id1} {commit id2}
cherry pick 多个特定 commit, 使用空格分割, 另外其实多个 commit id 的前后顺序不重要因为对应的 commit id 会按照时间叠加
git cherry-pick --continue
cherry pick 的时候如果遇到 conflict, 那么会中断然后需要 merge, merge 之后 commit 之后就可以 continue, 如果要退出 cherry-pick, 那么就是用 --abort

git config

1
2
3
4
5
6
7

git config --list
查看相关配置
本地配置的位置是在 .git/config
Global 的配置位置在 ~/.gitconfig
git config --list --show-origin
查看相关配置

给特定项目设置特定的 user:

这部分也可以到 .git/config 添加以下内容

1
2
3
4
git config user.name "what ever"
git config user.email anyone@anysite.any # 需要注意的是随后的提交就会按照这个 email 来设置, user.name 很可能会被复写
git config --global user.name "what ever"
git config --global user.email anyone@anysite.any

Reference

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
46
47
48
49
50
51
52
53
54
55
56
57
58
git commit -am "init" 提交并且加注释
git remote add origin git@192.168.1.119:ndshow
git push origin master 将文件给推到服务器上
git remote show origin 显示远程库 origin 里的资源
git push origin master:develop
git push origin master:hb-dev 将本地库与服务器上的库进行关联
git checkout --track origin/dev 切换到远程 dev 分支
git branch -D master develop 删除本地库 develop
git checkout -b dev 建立一个新的本地分支 dev
git merge origin/dev 将分支 dev 与当前分支进行合并
git checkout dev 切换到本地 dev 分支
git remote show 查看远程库
git add .
git rm 文件名 (包括路径) 从 git 中删除指定文件
git clone git://github.com/schacon/grit.git 从服务器上将代码给拉下来
git config --list 看所有用户
git ls-files 看已经被提交的
git rm [file name] 删除一个文件
git commit -a 提交当前 repos 的所有的改变
git add [file name] 添加一个文件到 git index
git commit -v 当你用-v 参数的时候可以看 commit 的差异
git commit -m "This is the message describing the commit" 添加 commit 信息
git commit -a -a 是代表 add, 把所有的 change 加到 git index 里然后再 commit
git commit -a -v 一般提交命令
git log 看你 commit 的日志
git diff 查看尚未暂存的更新
git rm a.a 移除文件 (从暂存区和工作区中删除)
git rm --cached a.a 移除文件 (只从暂存区中删除)
git commit -m "remove" 移除文件 (从 Git 中删除)
git rm -f a.a 强行移除修改后文件 (从暂存区和工作区中删除)
git diff --cached 或 $ git diff --staged 查看尚未提交的更新
git stash push 将文件给 push 到一个临时空间中
git stash pop 将文件从临时空间 pop 下来
-------------------
git remote add origin git@github.com:username/Hello-World.git
git push origin master 将本地项目给提交到服务器中
---------------------
git pull 本地与服务器端同步
---------------------------
git push (远程仓库名) (分支名) 将本地分支推送到服务器上去.
git push origin serverfix:awesomebranch
----------------------------
git fetch 相当于是从远程获取最新版本到本地, 不会自动 merge
git commit -a -m "log_message" (-a 是提交所有改动, -m 是加入 log 信息) 本地修改同步至服务器端
git branch branch_0.1 master 从主分支 master 创建 branch_0.1 分支
git branch -m branch_0.1 branch_1.0 将 branch_0.1 重命名为 branch_1.0
git checkout branch_1.0/master 切换到 branch_1.0/master 分支

git branch -r -d branch_remote_name 删除远程 branch
---------------------

mkdir WebApp
cd WebApp
git init 本地初始化
touch README
git add README 添加文件
git commit -m 'first commit'
git remote add origin git@github.com:daixu/WebApp.git

Troubleshooting

Unable to create ‘E:/xxx/.git/index.lock’: File exists.

解决方案: 在. git 同级目录, 执行 rm -f .git/index.lock 将文件删除即可提交成功