https://ohshitgit.com/

基本操作

工作区 --> 暂存区 git add . ,撤销 git rm --cached .
暂存区 --> HEAD git commit , 对最近一次提交修改注释 --amend
工作区 --> HEAD git commit -a
HEAD --> 工作区 git reset --head(清空工作区、暂存区)用于pull、rebase等操作后的恢复

远程仓库

列出远程仓库
git remote -v

列出远程仓库详细信息
git remote show [remote-name]

添加
git remote add origin [url]
origin就是一个别名,默认叫origin

删除
git remote rm [remote-name]

重命名
git remote rename old-name new-name

分支

查看本地分支及追踪的分支
git branch -vv

查看本地、远程分支
git branch -av

切换分支

git checkout master
git checkout origin/master

git将当前分支上修改的东西转移到新建分支

第一种方法
在A分支修改完成后,不用做commit,只需要在A分支新建B分支,然后切换过去。
这个时候你会发现修改的东西在A,B分支都有。
这个时候在B分支commit,那么这些修改保留在B分支上,再切换到A分支上会发现修改都没有保留下来。

第二种方法
使用git stash 将A分支暂存起来,然后在某一个分支(如master分支)新建一个分支B,然后在B分支上使用git stash pop 将修改弹出到B分支上,然后这些修改就在B分支上了。

创建本地分支

在本地创建一个新分支,该分支可是是从当前分支上检出的,也可是从远程分支检出的。
-b 创建成功后,自动切换至新分支上。
git checkout -b 新本地分支名
git checkout -b 新本地分支名 origin/远程分支名
-b create and checkout

创建远程分支

git branch orgin/远程分支名
也可以通过“推送”创建

HEAD detached

head指最新的头节点指向,每个叫 master 的repository都会有一个head, 一个repository可以包含任意数量的head。在任何时候,只要这个head被选择成为”current head“,那么这个head就成了HEAD,总是大写

’detached HEAD’,即现在HEAD指向的是一个没有分支名字的修订版本,“游离”于已知的所有分支之外。所以游离HEAD的问题就在于它没有一个具体的分支名,git branch temp 最近的commitId 将HEAD指向的commit命名为分支temp,然后切换到分支master上,执行merge命令git merge temp,最后删除临时分支git branch -d temp

2. 文件提交后,push到远程服务器

git remote -v 查看远程仓库地址
git remote add 远程仓库名origin 远程仓库地址
git branch --set-upstream-to=origin/<branch> master 设置远程跟踪,设置本地分支master跟踪origin/<branch>远程分支
git push --set-upstream 远程仓库名 远程分支名

远程服务器的文件可能在你push前已经变动了,这种情况下再提交会不成功:

图片描述

解决1:

git pull 远程文件到本地。= fetch+merge

git checkout --track origin master -b localName
获取远程分支master 到本地新分支localName,并跳到localName分支
--track,让创建的本地分支localName追踪的远程分支中远程的origin/remoteName分支。
避免本地仓库分支和远程仓库分支并未进行关联,即本地分支未追踪到远程分支。

情况1):

远程变动的文件与你修改的文件不是同一文件,pull后不会影响你的修改的文件
比如新加了文件的情况:
图片描述

情况2):

远程变动的文件正好是你改了的文件,pull后会自动merge

图片描述

然后再看看你修改的文件会有出现<<<<<<< HEAD、=======、>>>>>>>
HEAD和=号之间表示你本地文件的内容,
=号和>>>>>>>之间表示要合并的内容(别人改的),后面也会接分支名称。
你需要根据情况修改下文件最后再删除那些符合,最后后 add 、 commit 、 push即可

需要注意的是:
有的时候pull下来,会覆盖你修改的文件,所以git pull操作前还是先stash。

解决2:

git push -f 强制推送。但服务器上的文件若有冲突,会以冲突形式显示

推送

git push origin master
git push --set-upstream origin 本地分支名:远程分支名同时设置了跟踪

将本地分支push到远程,并建立远程同名分支

git push -u origin 本地分支名
-u 即 --set-upstream 的简写

case

创建了一个 temp 分支,做了一些修改后,使用git push origin master提交,但是显示的结果却是'Everything up-to-date',发生问题的原因是git push origin master 在没有track远程分支的本地分支中默认提交的 master 分支,因为 master 分支默认指向了origin master 分支,这里要使用git push origin temp:master 就可以把 temp 推送到远程的master分支了。
$ git push origin master
Everything up-to-date
$ git push origin master -f
Everything up-to-date
$ git push origin temp:master
就好了

减少提交次数

$ git commit --amend --no-edit

# --amend 修改最新的一次 commit,将现在 staged change 直接添加到上一次 commit 去,不生成新的 commit
# --no-edit amend 的提交不修改提交信息

变基

rebase
为了确保在向远程分支推送时能保持提交历史的整洁,可以使用rebase来合并分支,而不是merge

case:剔除远程分支中的某个或某几个连续的提交

git rebase -i 前一个提交
pick改为drop,然后按照提示保存退出
参考:
变基,剔除某个提交
https://blog.csdn.net/Nathan1...
注意,这个操作会不仅造成修改的提交以及它的下一个提交改变提及号。

case:合并最近的 3个提交

git rebase -i HEAD~4
把不要的两个(比较新的,在下方的)的pick改为fixup,然后按照提示保存退出
参考:https://www.cnblogs.com/zhaoy...

image.png

case:修改commit注释

amend可以修改最后一次commit信息,但对于历史提交信息,也需要使用rebase命令。
参考
使用git push -f origin branch_name可以更新远程仓库的提交信息,注意,如果是协同开发最好不要这样。
https://git-scm.com/book/zh/v...

比较

工作区与暂存区文件比较: git diff --文件名
暂存区与HEAD比较:git diff --cached
多个提交间的比较:git diff 提交1 提交2 -- 文件名1 文件名2
多个分支之间的比较: git diff 分支1 分支2

恢复

工作区变回暂存区内容:git checkout --文件名
暂存区变回HEAD:git reset HEAD -- 文件名1 文件名2
工作区变回HEAD: git reset --hard 提交号(这样有些危险!工作区、暂存区会被清空!)
rebase后的恢复

其他:

git reflog
# 和 git log 的区别,它不仅仅是提交的记录,还有其他git的操作记录
# 对应的记录号
# 7b6e4f8 HEAD@{0}
# e7d2c90 HEAD@{1} 等等
git reset HEAD@{index}

删除对应的commit

git revert [2feb45f]

存储stash

不用提交,直接 git stash name1 git status发现工作区里修改的内存好像没了,其实是存储在一个栈空间里了,git stash list可查看,使用git stash apply name1git stash pop name1即可取出,

标签

git tag v1 //建立标签
git tag -a v1 -m '建立标签'
git show v1 //查看标签版本信息

Pasted Graphic 34.tiff

其他相关提交统计

项目成员数量、提交次数、代码行数信息统计命令
image.png


cashew
9 声望3 粉丝