本文首次编辑:2016-04-27。
- 查看 log,按 message 过滤、按 author 过滤、按日期过滤等。https://www.atlassian.com/git/tutorials/git-log。
- 灵活打 patch,https://www.jianshu.com/p/814fb6606734
- 第一次切换分支,git checkout -b xxx origin/xxx
- 后续切分支,git checkout xxx
- 删除本地分支,git branch -d xxx
- 删除远程分支,git push origin –delete xxx
- 查看当前分支,git branch -a | grep “*”
- git checkout到特定版本,git checkout upstream的前8位
- git clone / push 的时候不用密码:
git config --global credential.helper 'cache --timeout 7200'
,timeout 的单位为秒。 - 创建分支,
git checkout -b newbranch
- 重命名分支,
git branch -m oldBranch newBranch
- 提供本地分支到远程 repo(远程 repo 无此分支),
git push origin newBranch
orgit push -u origin newBranch
- 强制推送本地修订,覆盖远程 repo。会覆盖此间别人的提交。
git push --force-with-lease
打 patch 时,如何把 patch 中的 commit message 和 user 保持不变?
git am xxx.patch
,与git format-patch
相对应stage
Q:多一个 stage 有什么优点?
A:暂存空间。git add 后的文件放到 stage 区,再修改同样的文件,其修订不会体现在此次 commit,除非再 git add 一次。
- git format-patch,已提交版本生成 patch
git format-patch -<n> <SHA1>
,输出从 SHA1 开始的 n 个提交 patch,会输出 10 个 patchgit format-patch -10 HEAD --stdout > 0001-last-10-commits.patch
,输出最新前 10 次修订为一个 patch
git log -p -1 <commit>
,查看某次提交的具体修订git diff sha1 sha2 > mypatch.diff
,输出 sha1 到 sha2 的所有修订,如果 sha1 比 sha2 早,则是修订 patch,如果晚,则是回退 patch。- git am -3 –ignore-space-change,只能使用 format-patch 的 patch
- git config core.editor vim
- git checkout file,可以让 file 从 staged 状态返回 untracked 状态
- git checkout – file
- git reset HEAD file,让文件从 staged 返回 modified 状态
- git clean -f -d,删除未被跟踪的任何文件/目录
- .gitignore,忽略不需要跟踪的文件
- git revert commitid,撤消某个修订并自动 commit
- git reset –soft,回退修订
- 基于某个 commitid 创建新分支 name
- git reset –hard commitid
- git branch name
- git merge,不推荐使用。可通过 git format 打 patch,优势是可以看到同步的每个修订。
- git cherry-pick commitid,单独同步某次提交
- git show commit
- git commit –amend,修改最后一次提交的 log
- git rebase,不推荐新手使用。
git reset –hard commitid, git push, 回退到某个特定版本
git remote -v,查看当前仓库的链接
- git status –untracked-files=no,git status 只查看跟踪的文件,同 git status -uno
- 回退某个文件的到特定版本,
git checkout c5f567 -- file1/to/restore file2/to/restore
,详见 stackoverflow
删除未被跟踪的任何文件和目录
注意:本操作会删除所有未加入 git 版本管理的文件。
在对应组件源码目录下,git clean -f -d -X
,清除该目录中所有没有被跟踪的文件。
1 | NAME |
样例:
1 | jerome@compile:~/sb/src/libttoo$ git status |
git fork 一个仓库到本地后,同步远程仓库的修订
详见:
1 | $ git clone http://192.168.199.32/sonic/libteam/ |
如果远程“父”仓库的有很多 tags 和 branches,如何同步到本地远程 repo?
1 | $ git remote add upstream https://github.com/opencomputeproject/SAI |
合并多次本地提交
- 不喜欢默认编译器 nano,先配置一下默认编辑器为 vim:
git config --global core.editor vim
- git rebase -i HEAD~2,合并前两次提交
1 | $ git log |
改要保留的提交 log 为 pick,把要合并的提交改为 squash。如上文改为
1 | pick 19c2ee6 [Version Control] remove modules are not needed |
保存退出后看 git log:
1 | $ git log |
处理 merge 冲突
- git pull 发现有冲突
1 | $ git pull |
- 打开冲突的文件 .gitmodules
1 | $ vi .gitmodules |
- fix 对应的冲突
例如上文修订为:
1 | [ ] |
- 提交 fix 的结果
1 | $ git add .gitmodules |
- 提交代码
1 | $ git push origin your_branch |
如何不留 log 的 revert?(强制提交本地 repo 内容)
强制 revert 远程服务器的内容为本地 repo 内容。一般为 rebase 之后所需。
命令:git push --force-with-lease
但是如果不是洁癖,最好还是用 git revert
,有记录地回退。
查看某个 commit id 属于哪个 tags 或 branch
git branch -r --contains commitid
git tag --contains commitid
tag 相关操作
git tag -l
列出全部 taggit checkout <tag_name>
,detach 到某个 taggit checkout tags/<tag_name> -b <branch_name>
,根据某个 tag 创建分支- 查看某个 commmitid 是否属于某个 tag
git tag --contains commitid
如何 merge 其他 repo 中的某次提交?
- 添加其他 repo,
git remote add upstream your_repo_url
- 下载其他 repo 的代码:
git fetch upstream
- 查看其他 repo 的 log:
git log upstream/master
- 合并某次提交:
git cherry-pick your_repo_commit_id
git am 失败如何合代码
类似这个链接:https://blog.csdn.net/sunnylgz/article/details/7660638。
出现问题时:
- git apply –reject xxx.patch
- 到对应目录,应可以看到有对应的 .rej 文件,打开一看就可以看出是哪段代码合不进去。
- 手动处理冲突
- git add 对应文件
- git am –continue
查看本地分支与远程分支的差异
git status 的时候经常可以看到 Your branch is ahead of 'origin/xxx' by 3 commits.
,有时候可能不知道这个 ahead / behind 的 commits 分别是什么。可通过 git log origin/xxx..xxx
查看,xxx 指分支名,以 master 分支为例,git log origin/master..master
。
git log 导入 excel
- stackoverflow,
git log --pretty=format:%h,%an,%ae,%s > /path/to/file.csv
,然后导入 csv,以 “,” 为分隔符隔开。前面 git log 输出格式为(hash [abbreviated], author name, author email, subject)。 - 类似 svn log –stop-on-copy 功能,只取分支创建后的记录
- 本地 git checkout 目标分支和目标分支的父分支。
git log base_branch..target_branch --pretty=format:%h,%an,%ae,%s > your.csv
git add 提示 “error: insufficient permission for adding an object to repository database .git/objects”
- 原因:.git/objects 中的权限有问题
- 解决:见 https://stackoverflow.com/questions/6448242/git-push-error-insufficient-permission-for-adding-an-object-to-repository-datab,
sudo chown yourname:yourgroup -R .git/objects/
1 | $ git add openssh_7.9p1.orig.tar.gz.asc |