git使用笔记

一些git的常用命令,记在这里方便查找(懒得去翻help)

创建版本库 & 提交上传

# 将一个文件夹初始化成版本库
git init

初始化之后会在目录下新生成一个.git目录,是git用于跟踪管理版本库的,可以通过ls -ah命令查看

# 添加到暂存区
git add <filename>

# 报告当前状况
git status

# 提交到版本库并留下本次提交说明
git commit -m <message>

# 未add前查看本次修改的内容
git diff <filename>

# 查看修改记录(见化输出至一行)
git log (--pretty=oneline)

git版本回退

git中版本号是SHA1计算出的一个大数,避免了分布控制时版本号冲突

# 版本回退
git reset --hard HEAD^

HEAD:表示当前版本,上一个版本就是HEAD^,上上个就是HEAD^^

回退之后在版本信息中就无法找到在回退之后的内容了,但是可以通过版本号回到指定版本,可以通过只打出前几位,通过缺省进行补全。原因是git的链表式存储方式。

如果在关闭窗口后还想回到新的版本,可以通过以下找到对应版本号,完成回退

# 查看执行过的每一个命令
git reflog

工作区 & 暂存区

电脑上的文件夹learngit就是一个工作区,工作区指电脑里能看到的目录。

而该文件夹下的.git隐藏目录就是git的版本库,其中最重要的是stage(index)暂存区,以及master分支,还有指向master的一个指针HEAD。

git add是提交到暂存区,git commit是从暂存区提交到当前分支。

管理修改

git管理的是修改,不是文件,修改如果不add到暂存区,那么最后commit的时候也不会提交上去

# 查看工作区和版本库里面最新版本的区别
git diff HEAD -- readme.txt

撤销修改

提交前发现错误

git checkout -- readme.txt
# 注意"--",如果没有的话就是切换到另一个分支了,分支管理中将再次使用。

把readme.txt文件在工作区的修改全部撤销,如果该文件还没有add到暂存区,撤销就是回到版本库中上一个状态;如果是add之后做了修改,撤销就回到暂存区中的状态。总之就是回退到上一次add或者commit的状态。

add后发现错误

git reset HEAD <filename>

可以把暂存中的修改撤销掉(unstage),重新放回工作区,也就是说,git reset既可以回退版本,还可以把暂存区的修改回退到工作区,HEAD的意思是,回退到最新的commit的版本。

重新放回工作区之后,可以通过上一节的命令来处理工作区的问题。

commit之后发现错误

  • 如果git还没有把本地版本推送到远程,那么可以通过版本回退处理
  • 如果已经退送到远程,git分布式就决定了,一旦推送到远程版本库,没救了,这次修改就该不动了……吧?

删除文件

# Linux系统中从工作区删除文件
rm test.txt

当git的版本库和工作区不一样的时候,git status就会返回差异,但是此时版本库中的文件还没有删除,可以通过

git rm test.txt
git commit -m "remove test.txt"

如果误删除文件,还把这个变动添加到了暂存区,那就需要先进行一步

git reset HEAD <filename>

如果只是在工作区里误操作误删除了,可以通过

git checkout -- test.txt

把误删除文件返回到最新版本,如果commit之后,还可以通过回退版本号来回退。

远程仓库

分布式管理,每台机器上的版本库都是一样的,没有主次之分。

github是提供git仓库托管服务的,可以通过注册账号白嫖,本地仓库与github远程仓库是通过SSH加密的,需要一些设置。

# 创建SSH Key(先看看主目录下有无ssh目录
ssh-keygen -t rsa -C "m15265723639@163.com"
# 然后后续设置使用默认值(一路回车

# 登录github,添加上刚才生成的公钥is_rsa.pub,随便起一个title就好了
# 这样就做到了把这台电脑的Key添加到github了

在Github上托管的免费仓库,只有自己能修改,但是所有人都能看到。

可以通过私有化仓库(付费,或者自己搭一个git服务器来做到

添加远程库

在Github上获取一个远程库之后,可以通过提示的SSH方式把本地内容推送到远程库

# 把本地关联到远程库
git remote add origin git@github.com:Uniqsy/learngit.git

# 把本地库所有内容推送到远程库
git push -u origin master

本质上是把本地的master分支推送到远程

-u:Git不但会把本地的master分支内容推送到远程master分支,还会把本地master分支和远程master分支关联起来,这样可以简化以后的推送,后续推送就只需

git push origin master

第一次使用Git的clone或者push命令时,会有警告去确认是否连接到了正确的Github服务器,可以通过检查网站上给出的信息来进行比对确认,以后的push或者clone里就不会有了。

从远程库克隆

git clone git@github.com:Uniqsy/gitskills.git

Git支持多种协议,包括https但是通过ssh支持的原生git协议速度最快。

分支管理

Git中的分支管理都是基于类似于链表的东西,所以切换分支以及合并分支都十分迅速。

# 查看分支
git branch

# 创建分支
git branch <branchname>

# 切换分支
git checkout <branchname>

# 创建切换分支
git checkout -b <branchname>

合并某分支到当前分支
git merge <branchname>

删除分支
git branch -d <branchname>

解决冲突(两条分支都存在修改

两条分支上对于同一个文件进行了修改,产生文件上的冲突还得手动解决

合并产生冲突后手动修改文件使之一样酒醒,可以通过

git log --graph --pretty=oneline --abbrev-commit

查看像是个图的合并结果

分支管理策略

git merge --no-ff -m "merge with no-ff" dev
# 在合并分支时添加参数,禁用fast forward可以创建一个commit然后以后查看本次合并的信息,否则看不出分支曾经合并过

一般来说,在dev分支上开发,然后等需要的时候再合并回master分支

bug分支_切换分支需要保存现场

# 保存当前工作进度
git stash

#查看保存的工作进度
git stash list

# 恢复
git stash apply

# 删除
git stash drop

# 一步完成
git stash pop

假设当前在master上发现了bug并通过分支fix_bug进行了修改,但是目前的dev也存在bug所以需要将master上进行的修改复制到dev上进行再进行修改

在dev分支下,可以将操作复制执行一遍,也可以从dev修改,然后在master进行cherry-pick

git cherry-pick <版本号>

Feature分支

开发一个新feature,最好新建一个分支

git branch -D <name>
# 强行删除没有合并过的分支

多人协作

# 查看远程库信息,显示可以抓取和推送的origin的地址
git remote -v

# 推送一个分支到远程库对应的远程分支
git push origin <分支名>

不是所有的分支都一定需要推送到远程

  • master分支是主分支,此要时刻与远程同步;
  • dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
  • bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
  • feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

多人协作模式:

  1. 首先,可以试图用git push origin 推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令

git branch --set-upstream-to <branch-name> origin/<branch-name>