Git常用命令备忘录

网友投稿 676 2022-05-29

增加删除文件

添加指定文件到index

git add [file1] [file2] ... git add [dir] git add .

删除workspace文件,并且将这次删除放入index

git rm [file1] [file2] ...

停止追踪指定文件,但该文件会保留在workspace

偶然把application.log加到代码库里了,现在每次运行应用,git 都会报告在application.log里有未提交的修改。把 *.login 放到了 .gitignore 文件里,可文件还是在代码库里,怎么才能告诉 git “撤销” 对这个文件的追踪呢?

虽然.gitignore会阻止 git 追踪文件的修改,甚至不关注文件是否存在,但这只是针对那些以前从来没有追踪过的文件。一旦有个文件被加入并提交了,git 就会持续关注该文件的改变。类似地,如果你利用git add -f来强制或覆盖了.gitignore, git 还会持续追踪改变的情况。之后你就不必用-f来添加这个文件了。

如果希望从 git 的追踪对象中删除那个本应忽略的文件,git rm --cached会从追踪对象中删除它,但让文件在磁盘上保持原封不动。因为现在它已经被忽略了,你在git status里就不会再看见这个文件,也不会再偶然提交该文件的修改了。

git rm --cached [file]

改名文件,并且将这个改名放入index

git mv [file-original] [file-renamed]

代码提交本地仓库

提交index到Repository

git commit -m [message]

提交index中指定文件到Repository

git commit [file1] [file2] ... -m [message]

提交workspace自上次commit之后的变化,直接到Repository中

git commit -a

提交时显示所有的diff信息

git commit -v

使用一次新的commit,替代上一次commit,如果代码没有任何变化,则用来改写commit信息

在最后一条 commit 消息里有个笔误,已经执行了git commit -m "Fxies bug #42",但在git push之前你意识到消息应该是 “Fixes bug #42″。

该命令会用一个新的 commit 更新并替换最近的 commit ,这个新的 commit 会把任何修改内容和上一个 commit 的内容结合起来。如果当前没有提出任何修改,这个操作就只会把上次的 commit 消息重写一遍。

git commit --amend -m [message]

重做上一次的commit,并包括指定文件的变化

git commit --amend [file1] [file2] ...

更新代码

git pull <远程主机> <远程分支>:<本地分支>

如果要取回origin主机的next分支,与本地的master分支合并,使用命令:git pull origin next:origin,如果远程分支是与当前分支进行合并,则冒号后的部分可以忽略,简写为git pull origin next,上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再执行git merge。

git fetch origin git merge origin/next

在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动”追踪”origin/master分支。

Git也允许手动建立追踪关系。

git branch --set-upstream master origin/next

上面命令指定master分支追踪origin/next分支。

如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。

git pull origin

上面命令表示,本地的当前分支自动与对应的origin主机”追踪分支”(remote-tracking branch)进行合并。

如果当前分支只有一个追踪分支,连远程主机名都可以省略。

git pull

上面命令表示,当前分支自动与唯一一个追踪分支进行合并。

代码提交远程仓库

git push命令用于将本地分支的更新,推送到远程主机。它的格式与git pull命令相似。

git push <远程主机> <本地分支>:<远程分支>

git push origin master命令表示,将本地的master分支推送到origin主机的master分支。如果master不存在,则会被新建。

如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。

git push origin :master # 等同于 git push origin --delete master

如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略,使用git push origin。前面命令表示,将当前分支推送到origin主机的对应分支。如果当前分支只有一个追踪分支,那么主机名都可以省略,直接使用git push。

如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push,git push -u origin master。前面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。

不带任何参数的git push,默认只推送当前分支,这叫做simple方式。此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。如果要修改这个设置,可以采用git config命令。

git config --global push.default matching # 或者 $ git config --global push.default simple

还有一种情况,就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要使用–all选项,git push --all origin。前面命令表示,将所有本地分支都推送到origin主机。

如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。这时,如果你一定要推送,可以使用–force选项。

git push --force origin

上面命令使用-–force选项,结果导致在远程主机产生一个”非直进式”的合并(non-fast-forward merge),应该尽量避免使用–-force选项。

其他示例:

1.推送本地分支lbranch-1到新的远程分支rbranch-1: git push origin lbranch-1:refs/rbranch-1 2.推送lbranch-2到已有的rbranch-1,用于补充rbranch-1: git checkout lbranch-2 git rebase rbranch-1 git push origin lbranch-2:refs/rbranch-1 3.用本地分支lbranch-2覆盖远程分支rbranch-1: git push -f origin lbranch-2:refs/rbranch-1 # 或者 git push origin :refs/rbranch-1 //删除远程的rbranch-1分支 git push origin lbranch-2:refs/rbranch-1 4.推送tag git push origin tag_name 5.删除远程标签 git push origin :tag_name

查看信息

显示有变更的文件

git status

显示当前分支的版本历史

git log

显示commit历史,以及每次commit发生变更的文件

git log --stat

显示某个文件的版本历史,包括文件改名

git log --follow [file] git whatchanged [file]

显示指定文件相关的每一次diff

git log -p [file]

显示指定文件是什么人在什么时间修改过

git blame [file]

显示暂存区和工作区的差异

git diff

显示暂存区和上一个commit的差异

git diff --cached [file]

显示工作区与当前分支最新commit之间的差异

git diff HEAD

显示两次提交之间的差异

git diff [first-branch]...[second-branch]

显示某次提交的元数据和内容变化

git show [commit]

显示某次提交发生变化的文件

git show --name-only [commit]

显示某次提交时,某个文件的内容

git show [commit]:[filename]

显示当前分支的最近几次提交

提交了几个 commit,然后用git reset --hard撤销了这些修改,接着你又意识到:你希望还原这些修改。

git reflog 对于恢复项目历史是一个超棒的资源。可以恢复几乎任何东西,任何你 commit 过的东西,只要通过 reflog

可能已经熟悉了git log命令,它会显示 commit 的列表。git reflog也是类似的,不过它显示的是一个 HEAD 发生改变的时间列表.

一些注意事项:

它涉及的只是 HEAD 的改变。在你切换分支、用git commit进行提交、以及用git reset撤销 commit 时,HEAD 会改变,但当你用git checkout -- 撤销时(正如我们在前面讲到的情况),HEAD 并不会改变 — 如前所述,这些修改从来没有被提交过,因此 reflog 也无法帮助我们恢复它们。

git reflog不会永远保持。git 会定期清理那些 “用不到的” 对象。不要指望几个月前的提交还一直躺在那里。

你的 reflog 就是你的,只是你的。你不能用git reflog来恢复另一个开发者没有 push 过的 commit。

那么怎么利用 reflog 来“恢复”之前“撤销”的 commit 呢?它取决于你想做到的到底是什么:

如果你希望准确地恢复项目的历史到某个时间点,用git reset --hard [SHA]

如果你希望重建工作目录里的一个或多个文件,让它们恢复到某个时间点的状态,用git checkout [SHA] --[filename]

如果你希望把这些 commit 里的某一个重新提交到你的代码库里,用git cherry-pick [SHA]

git reflog

撤销

恢复index的指定文件到workspace

一只猫从键盘上走过,无意中保存了修改,然后破坏了编辑器。不过,你还没有 commit 这些修改。你想要恢复被修改文件里的所有内容,就像上次 commit 的时候一模一样

git checkout会把工作目录里的文件修改到 git 之前记录的某个状态。你可以提供一个你想返回的分支名或特定 SHA ,或者在缺省情况下,git 会认为你希望 checkout 的是 HEAD,当前 checkout 分支的最后一次 commit

用这种方法“撤销”的任何修改真的会完全消失。因为它们从来没有被提交过,所以之后 git 也无法帮助我们恢复它们。要确保自己了解你在这个操作里扔掉的东西是什么!(也许可以先利用git diff确认一下)

git checkout [file]

恢复某个commit的指定文件到workspace

git checkout [commit] [file]

恢复上一个commit的所有文件到workspace

git checkout .

重置index的指定文件,与上一次的commit保持一致,但workspace不变

在本地提交了一些东西(还没有 push ),但是所有这些东西都很糟糕,你希望撤销前面的三次提交,就像它们从来没有发生过一样。

git reset会把你的代码库历史返回到指定的 SHA 状态。这样就像是这些提交从来没有发生过。缺省情况下,git reset会保留工作目录。这样,提交是没有了,但是修改内容还在磁盘上。这是一种安全的选择,但通常我们会希望一步就“撤销”提交以及修改内容,这就是 --hard 选项的功能。

git reset [file]

重置index与workspace,与上一次commit保持一致

git reset --hard

重置当前分支的指针为指定commit,同时重置index,但workspace不变

git reset [commit]

重置当前分支的HEAD为指定commit,同时重置index和workspace,与指定commit一致

git reset --hard [commit]

重置当前HEAD为指定commit,但保持index和workspace不变

git reset --keep [commit]

新建一个commit,用来撤销指定commit,后者的所有变化都将被前者抵消,并且应用到当前分支

已经执行了git push,将修改发送到了 github ,意识到某个 commit 是有问题的,需要撤销那一个 commit 。

该操作会产生一个新的 commit ,和指定的 SHA 对应的 commit 是相反的(或者是说是反转的)。如果原先的 commit 是“物质”,新的commit就是“反物质”。任何从原先的 commit 里删除的内容会在新的 commit里被加回去,任何在原先的 commit 里加入的内容会在新的 commit 里被删除

这是 git 最安全、最基本的撤销场景,因为其不会改变历史。

git revert [commit]

参考资料:

Git常用命令备忘录

廖雪峰的官方网站

易百Git教程

Git

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:ConvTranspose2d(逆卷积)的原理和计算ConvTranspose2d原理,深度网络如何进行上采样?
下一篇:力扣(LeetCode)刷题,简单+中等题(第31期)
相关文章