Git Tips

安全的强推 push —froce-with-lease

荐使用更安全的 force push 命令:

1
git push --force-with-lease

该版本可以确保,不会覆盖其他人的提交。如果有尚未 fetch 的远程提交,该命令会提示并中止执行。

定位某个 commit 合入的版本

git name-rev <commit-id>

查看本地尚未 push 的提交

git cherry -v

指定要比较的远程分支:

git cherry -v origin/somebranch

merge & rebase

  • 执行 git checkout --ours path (以及 git checkout --theirs path )命令时,要格外注意,这里的 ourstheirs 容易搞混:

    • 在做 merge 时:

      -    *ours* 指当前的分支          
      -   *theirs* 指要合入的目标分支      
      
    • 在做 rebase 时:

      -    *ours* 指 rebase 参数所指定的分支          
      -   *theirs* 指当前在做 rebase 的分支    
      

    原因解释:因为 rebase 是通过一系列的 cherry-pick 来实现的,是把当前分支的 commit cherry-pick 到指定分支。因此,在 cherry-pick 的过程中,指定的分支被视为 ours,而被 rebase 的当前分支被视为 theirs

  • HEAD~HEAD^ 的区别

Tags

push tags: git push --tags

rename tag:

1
2
3
4
5
git tag new old
git tag -d old

# old 前面的 `:` 会从远程仓库中删除该 tag
git push origin new :old

Git 代理配置

.gitconfig 配置:

1
2
3
4
[user]
    email = username@gmail.com
[http]
    proxy = localhost:7777

.gitconfig 文件可放在家目录下(影响当前用户),亦可放在单个 git 仓库下(仅影响当前仓库)。

也可以采用如下命令来设置代理:

1
2
3
4
5
# 是的,支持 socks5 协议
git config --global http.proxy 'socks5://127.0.0.1:7070'

# 取消代理
git config --global --unset http.proxy

参考这篇文档,虽然名字叫 http.proxy ,但其实也支持 https。

另外,如果希望域名也通过代理来解析的话,则应该将 socks5 替换为 socks5h

Git through ssh

1
2
# git through ssh
git remote add origin ssh://user@my.git.svr/path/to/repo

git filter-branch

// TODO

Git branching model

参考:https://nvie.com/posts/a-successful-git-branching-model/

updatedupdated2023-03-282023-03-28