轻松取消Excel密码的三种简单有效方法
720
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 --
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
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。