Git

整理常用的 Git 操作。


返回或者取消过去的某个 commit

这个牵涉到多种不同情况。

1) 强制删除本地分支尚未 commit 的改动(恢复到最近一次的 commit)

这是你想要删除本地所有的改动,恢复到最近一次 commit 状态。此时直接 reset 到 HEAD commit 即可:

git reset --hard HEAD

注意:它会永久删除你尚未 commit 的改动,所以谨慎行之。

2) 回到之前某一次 commit 并且强制删除所有改动

如果要回到之前某一次 commit,同时你确定要删除所有的改动。此时还是用 reset --hard

如果你知道你要回到的 commit ID(例如 0d1d7fc32),直接可以暴力

git reset --hard 0d1d7fc32

注意:这样会永久删除从 0d1d7fc32 开始到当前位置这中间的所有的 commit 改动。

如果要回到例如当前最近的 commit 之前第 2 个 commit,可以这样:

git reset --hard HEAD^2

注意:有关 ^~的用法比较 tricky,尤其是对于庞大的 commit graph 复杂的工程,因此个人建议,如果不是很确定,最好不要使用,而是尽可能使用 commit-id。参考:What’s the difference between HEAD^ and HEAD~ in Git?

如果使用 git reset --hard HEAD则是抛弃所有本地尚未 commit 的改动,回到最近一个 commit。

3) 回到之前某一次 commit 但是不删除改动

即,回到某一次过去的 commit(例如 0d1d7fc32),但是并不删除从 0d1d7fc32 到当前之间的改动,而是只删除 commit IDs。这通常是为了删除一些多余的 commit IDs 以便重新设置 commits,并且保留本地改动。

git reset --soft 0d1d7fc32

设置本地分支和 remote 分支一模一样

git fetch origin
git reset --hard origin/<branch-name>

注意:这样会抛弃本地分支的所有改动,因此建议先备份一个新的分支。

从另一个分支中拷贝某一个文件覆盖到当前分支

Ref: http://wholemeal.co.nz/blog/2010/06/11/no-changes-did-you-forget-to-use-git-add/

如果只是想从本地的其他分支拷贝文件,那么,在你的当前分支中,直接用:

git checkout <another-branch> -- <relative-file-path> 

注意中间的那个将分支和文件隔开的双虚线”–“。另外注意,这是从另一个本地分支中拷贝某个文件(即,你要确保那个分支中有你想要的文件)。

如果你想从 remote 远程分支中拷贝文件:

git fetch
git checkout origin/<another-branch> -- <relative-file-path>

即,需要先 fetch 一下远程更新然后再拷贝,同时要加上 origin 关键字指代 remote 分支。

取消 add

取消(undo)刚刚添加的某个文件:

git reset <filename>

或者取消全部添加的文件:

git reset

重新设置一个文件(即,取消一个文件的改动)

https://stackoverflow.com/questions/7147270/hard-reset-of-a-single-file

这是重设一个文件为当前的 HEAD:

git checkout HEAD -- my-file.txt

注意 my-file.txt 是当前的相对路径。这里的 HEAD 也可以是历史的一个 commit 或者其他的 branch。

强制添加文件或文件夹

git add -f <your_file_or_folder_path>

添加全部文件(夹)但排除其中一个文件(夹)

Ref: https://stackoverflow.com/questions/50316434/add-all-files-using-git-add-except-one-directory/50316635

git add --all ':!<path>'

这里 <path>就是你要排除的文件或者文件夹。

忽略 untracked files list

Ref: https://stackoverflow.com/questions/11542687/git-how-to-ignore-all-present-untracked-files

可以这样:

git status -uno

保存用户名和密码

参考:https://stackoverflow.com/questions/35942754/how-to-save-username-and-password-in-git

有时候想要保存一下用户名和密码(即 credentials),这样将来就不用每次都输入了。两种方法:

方法1:显式将用户名和密码存入到本地(不安全但不限时间)

git config --global credential.helper store

之后再做任意的 git pull 等操作,再输入一次用户名和密码信息后,此后做任何远程操作也不用再输入了。不过注意,它会将用户名和密码信息显式存入到一个文件~/.git-credentials 中(in plaintext),任何人都可以查看,并不安全。

方法 2:将用户名和密码存入 Cache 一段时间(相对安全但是限时间)

git config --global credential.helper cache

默认的 cache 时间不清楚,估计是几十分钟。你也可以显示的限制时间:

git config --global credential.helper 'cache --timeout=3600'

这样的用户名和密码并非 plaintext,相对安全一些。

方法3:使用 ssh key(最安全且不限时间,但是设置麻烦)

这种方法需要你在 Github 或 Gitlab 上设置你机器的 ssh key。

你本地机器的 ssh key 如果已经创建好,那么通常是在 ~/.ssh/id_rsa 中,打开并把其全部内容粘贴到 Github/Gitlab 上即可:

  • Github 中是在:Go to github.com -> Settings -> SSH and GPG keys -> New SSH Key
  • Gitlab 中是 Setting –> SSH Key –> Key 下面的空格处。

如果 ssh key 还未创建,请参考相应链接创建:

  • Github: https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
  • Gitlab: https://code.byted.org/help/ssh/README#generating-a-new-ssh-key-pair

删除 remote 分支的一些 commits

https://stackoverflow.com/questions/3293531/how-to-permanently-remove-few-commits-from-remote-branch

可以首先在本地用 git reset --hard <some-previous-commit>,然后再用 git push --force origin <remote-branch>来强制将 remote 分支设置成和本地分支相同。

Search

    Table of Contents