git submodule add <repository 位置> <欲放置的位置> # 增加一個新的 submodule git add .gitmodules <放置的位置> git commit -m "Add submodule into version control" # 提交修改 git submodule init # 初始化.git/config
cd your-submodule-folder # 进入子模块所在文件夹 git pull origin master # 更新子模块,这里不会更新父项目 cd ..//回父项目目录 git add your-submodule-folder git commit -m "static/platform submodule updated" # 这里实际只提交了子模块commit id
git submodule init git submodule update # 或一条命令循环初始化及更新子模块 git submodule update --init --recursive
# 直接进入子模块文件夹,进行常规git操作 cd your-submodule-folder git add something git commit -m "modify something" cd .. # 还要回父项目根目录进行更新 git add your-submodule-folder git commit -m 'Submodule updated' git push
# 先砍掉目录 git rm --cached <欲移除的目录> rm -rf <欲移除的目录> # 修改 .gitmodules,将相关内容移除 vim .gitmodules # 再修改 .git/config,将相关内容移除 vim .git/config # 提交修改 $ git add .gitmodules $ git commit -m "Remove a submodule" # 安全起见再做个 sync: $ git submodule sync
git diff > ../sync.patch # 生成补丁 git apply ../sync.patch # 打补丁 git apply --check ../sync.patch # 测试补丁能否成功
git format-patch -1 git am
git diff –staged
或 git diff –cached
git whatchanged --stat # 或者 git log --name-status
#只对github.com git config --global http.https://github.com.proxy socks5://127.0.0.1:1080 #取消代理 git config --global --unset http.https://github.com.proxy)
git remote add [repo_name] git@remote_repo
git push [repo_name] [branch]
git push origin --delete branchname
git branch -a
还有遗留remote分支)git branch -r -d origin/your_branch_name
git remote prune origin
git tag -a tagname -m "message" [commit]
git push origin :refs/tags/目的标签名
解释:
# 事实上Git 的推送和删除远程标签命令是相同的,删除操作实际上就是推送空的源标签refs: git push origin 标签名 # 相当于 git push origin refs/tags/源标签名:refs/tags/目的标签名 # git push 文档中有解释: # tag <<tag>> means the same as refs/tags/<tag>:refs/tags/<tag>. # Pushing an empty <src> allows you to delete the <dst> ref from the remote repository.
git log --graph
来列出合并分支的 commit , 再一一查看.
git add FILE
: git rm --cached FILE # 撤销文件FILE git rm -r --cached FOLDER # 撤销文件夹FOLDER
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"
git cherry-pick
git config credential.helper store
这样会明文保存密码到 ~/.git-credentials
GIT_TRACE=2 GIT_CURL_VERBOSE=1 git clone <repo>
详见git 环境变量
git commit --allow-empty -m "Empty"
git commit --amend -m "new msg"
git config --global core.editor "vim"
git rev-list –objects –all | grep “$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')”
git filter-branch -f –index-filter 'git rm –cached –ignore-unmatch “your/big.file”' HEAD –all
git diff --ignore-space-at-eol
搞懂原理后发现, git 是一个典型的, 以方便实现而设计出的工具. 所以其并没有充分考虑使用的体验. 虽然它强大, 效率高, 但对使用者来说, 命令的正交性不强这一点, 就造成了使用者需要记住大量单独的命令. 考虑找个或弄个简化版的本地版本控制系统, 或者做个git的命令包装. 这篇文章不错:https://www.highflux.io/blog/what-makes-git-hard-to-use
.git
下.git/index
.git/objects
目录,一个对象一个文件, 使用 zlib 压缩:git cat-file
子命令来查看对象..git/refs
目录下:.git/refs/heads/
存分支引用..git/refs/HEAD
, 指向你当前所在分支的引用..git/refs/tags/
, tag引用.git/refs/remotes/
, Git 会把你最后一次推送到远端的每个分支的值都记录在该目录下git update-ref
可处理大部分 refs 相关的操作