git #
git module #
git submodule foreach git reset --hard HEAD
git submodule update
git submodule foreach "git checkout master; git pull"
git submodule foreach git clean -f
更新 submodule #
git submodule update --init
git submodule update --remote
merge vs squash vs rebase #
merge 不能保持 master 分支干净,但是保持了所有的 commit history,大多数情况下都是不好的,个别情况挺好 squash 也可以保持 master 分支干净,但是 master 中 author 都是 maintainer,而不是原 owner rebase 可以尽可能保持 master 分支干净整洁,并且易于识别 author
squash merge #
# 切换到目标分支
$ git checkout master
# 以 squash 的形式 merge
$ git merge --squash devel
# it does not produce a commit right away: you need an additional commit
$ git commit -m "squash branch"
- 你会发现,在 master 分支上居然有未提交的修改,然后你就需要在 master 上主动提交了修改,
- 注意,这里是你 commit 的,也就是改变了 commit 的 author。
- git merge has a –commit option, but it cannot be used with –squash.
- It was never possible to use –commit and –squash together.
参考:
rebase merge #
# 先切换到 devel 分支(不一样咯)
$ git checkout devel
# 变基
$ git rebase -i master
# 切换回目标分支
$ git checkout master
# 合并
$ git merge
- 我们在 devel 里面对照 master 进行了变基
- 所谓的变基其实就是找到两个分支共同的祖先
- 然后在当前分支上合并从共同祖先到现在的所有 commit
- 会选择怎么处理这些 commit
- 然后我们就得到了一个从公共 commit 到现在的单个 commit
- 这个时候别人将我们这个 commit 合并到 master 也只会在 master 上留下一个 commit 记录
合并 git commit #
参考:
git branch 与 git tag 同名 #
需要使用完整路径
git checkout refs/heads/v1.5.2
git checkout refs/tags/v1.5.2
git push -u origin refs/heads/v4.8.0
参考:
git pull force #
git fetch --all
# git reset --hard origin/<branch_name>
git reset --hard origin/master
参考:
hard reset
vs mixed reset
vs soft reset
#
# 回到 reset 版本,之后的文件都属于 git add 的状态
git reset --soft
# git reset 默认就是 --mixed
# 回到 reset 版本,之后的文件都属于 git add 前的状态
git reset --mixed
# 回到 reset 版本,之后文件都丢弃(使用 git reflog 可以找回来)
git reset --hard
git reflog #
reflog
是 Git 操作的一道安全保障,它能够记录几乎所有本地仓库的改变。
包括所有分支 commit 提交,已经删除的 commit
(其实并未被实际删除)都会被记录。
只要 HEAD 发生变化,就可以通过 reflog
查看到。
git 回退 #
# 文件放弃本地修改
git checkout -- <file>
# 回退到某个版本
git checkout commit-id <path>
git reset -- <path>
参考:
叶王 © 2013-2024 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。