Git Memo

Git 相关备忘。

Add

1
2
# 只stash某个文件
git stash push /path/to/file

DIFF

1
2
3
4
# 针对某文件对比两次提交
git diff HEAD^^ HEAD main.c
git diff HEAD^^..HEAD -- main.c
git diff HEAD~2 HEAD -- main.c

标签

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
# 列出标签
git tag
git tag -l "<tagname>"
# 展示
git show <tagname>
# 轻量标签
git tag <tagname>
# 附注标签
git tag -a <tagname> -m "<commit_info>"
# 后期打
git tag -a <tagname> <commit_id> -m "<commit_info>"
# 推送
git push origin <tagname>
git push origin --tags
# 删除本地
git tag -d <tagname>
# 删除远程
git push origin :refs/tags/<tagname>
git push origin --delete <tagname>
# 批量删除
git push -d $(git tag -l "tag_prefix*")
git tag -d $(git tag -l "*v3.[2]*-beta*")
git tag -d $(git tag -l v0.2.[0-5])
# 切换到标签位置
git checkout <tagname> # ①
# 从 tag 创建新分支
git checkout -b <branch> <tagname>

注意:①会使仓库处于 “分离头指针(detached HEAD)” 的状态,在 “分离头指针” 状态下,如果做了某些更改然后提交它们,标签不会发生变化, 但新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如要修复旧版本中的错误,那么通常需要『从tag创建新分支』。

分支

1
2
3
4
5
6
7
# 新分支
git checkout -b <new_branch_name> <tag_name>
# 冲突解决后
git rebase --continue
# 删除 -d删除成功merge的,-D强制删除
git push -d origin <branchname>
git branch -d <branchname>

提交

1
2
3
4
5
6
7
8
9
10
11
12
# 修改最近的提交
git commit --amend -m "new_message"
# 强制推送
git push --force repo_name branch_name
# 如果有其他改动会中止
git push --force-with-lease repo_name branch_name

# 修改历史提交消息
git rebase -i HEAD~3 # 3表示当前提交往前数3次
pick => reword, save & close
type new message, save & close
git push --force

Token

Fetch Folk

1
2
3
4
5
6
7
8
9
git remote -v
git remote add upstream https://github.com/otheruser/repo.git
git fetch upstream
git branch -va
git checkout main
# replay local work on top of the fetched branch, git pull --rebase
git rebase upstream/main
# merge, like git pull
git merge upstream/main

LargeFile

1
2
3
4
5
6
7
8
9
#  ***** Delete large committed files *****
git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch FOLDERNAME" -- --all

rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now

git push --all --force

Version

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2

1
2
3
4
5
6
7
8
9
10
~version  # only accept new patch
^version # accept new minor and patch
version # exact
>version
>=version
<version
<=version
1.2.x # 1.2.*
* # any
latest # obtain latest