Git

173 阅读4分钟

【概念】 commit 实际上是生成了一个commit对象,把所有文件夹的当前状态打包成了一个树。其中的文件夹树,每一级中的同级文件夹对应一颗树,每个完全相同的文件在git中存储为一个blob(加入暂存区时创建)

.git文件就是我们的本地仓库 工作区(Changes to be committed):代码行 暂存区(Changes not staged for commit):存储了待提交的改动,用于暂存与替换不同的方案 本地仓库:我们提交的所有版本的数据 分支:实际上是一个引用,指向一串的提交记录。 image.png

若当前文件被git关联(HEAD指向)且提交到了暂存区。若修改文件,则会如下图所示,表示有改动需要在工作区和暂存区提交。说明我们提交的永远是文件的改动。

【查看】 git branch -av:看本地和远端的分支,会有提前或滞后提示。

git log:查看历史 git log -p:查看每个commit的每行改动 git log --stat:查看文件修改 git show:查看最新commit

【(HEAD -> master) 表示当前工作区对应本地master分支 (origin/masger)表示之前的commit指向远程master分支】

git diff:比较工作区和暂存区的差别 git diff HEAD:比较工作区和本地仓库的差别 git diff --cached:比较暂存区和本地仓库的差异 git status:查看工作区和暂存区的状态

git reflog:本地操作记录

【创建】 git clone / git init 本地仓库关联远程仓库:git remote add origin (origin是远程仓库的代指) 与远程的某分支关联并推送:git push --set-upstream origin [branch] 创建新分支:git branch / git checkout -b 暂存:git stash(得到一个干净的工作区,再修BUG并add commit),git stash apply(取出手头工作)/ pop(取出手头工作并清除stack)

【提交】 1.远程仓库有一个提交,我们本地仓库也有一个提交,直接拉取远端代码到本地,若是同一个文件的修改,那么这两个提交谁先谁后呢(即本地和远程有其他冲突,push会失败):执行 git pull --rebase origin master,把远程库的更新合并到本地库,再git push就可以了。

【修改】 修改上一次commit的message信息:git commit --amend(实际上是生成新的并替换,ID不同了),所以直接push会失败。 修改历史提交的message信息:git rebase -i Head^^/Head~2 整合commit: git rebase -i commitID(LAST),把要合并的commit前字符改为s,则s会自动合到上面的pick。

【撤销】

丢弃提交(指向HEAD1即恢复到上个版本): git reset HEAD1:把本地仓库、暂存区指向HEAD1,工作区不变。 git reset --soft HEAD1:把本地仓库指向HEAD1(撤销到上次提交),工作区和暂存区不变。 git reset --hard HEAD1:把本地仓库、工作区、暂存区都指向HEAD1。 恢复工作区内容为暂存区:git checkout / restore -- xxx.java 删除暂存区中的文件:git rm xxx.java 丢弃历史提交:git rebase -i HEAD2 丢弃b到c的历史提交并(不包括b)接在a后面:git rebase a b c。

撤销某个提交:git revert commitid(生成一个与某次提交相反的提交,再push后就会删除对应提交!) 【revert 到你那个commit上,清除add到临时空间的记录,和master合并,完了和远程仓库合并,在push上去】

【团队协作】 [merge]: merge合并到当前:从当前分支和要合并的目标分支分叉点开始,将目标分支上的所有commit内容应用到当前commit,并生成新的commit。 merge时,若同文件发生冲突,出现了>>>>...,可以git merge --abort取消merge。 删除分支: git branch -D "id"

[rebase]: 合并到master分支并丢弃当前分支: 切到当前分支执行git rebase mast(即指针移动,没有指向的版本git会自动回收) + 切回master分支执行git merge(回到master分支再合并)

[git pull] == git fecth(远端变更) + git merge(本地远端合并)

多人开发同一远程分支: 若a修改了远程的A.java,b修改了本地的B.java,则不退不拉,直接git merge origin远端即可。 若a和b同时修改了A.java文件的不同区域,则git pull,git merge origin远端。若修改了同一区域,则merge时可覆盖,pull后可re修改,然后再push。

禁用 git push -f 禁止更改公共分支的历史,要基于追加新commit。因为公共分支已经被其他同事拉到了本地。

github搜索 xxx in:readme xxx stars:>1000