git 学习笔记

文章目录

一、git简介

1.inux上安装git
sudo apt-get install git

安装完后

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

Git是分布式版本控制系统,每个机器都必须自报家门:你的名字和Email地址。注意git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

2.创建版本库,即仓库(repository)
每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/

注意:windows目录中不能出现中文

git init 命令创建的目录为git可以管理的仓库
目录中会多一个.git的目录,这个目录是Git来跟踪管理版本库的,

3.提交操作

1.添加文件到仓库  git add fliename
2.提交文件到仓库  git add -m "message"

-m后面输入的是本次提交的说明,可以输入任意内容,能从历史记录里方便地找到改动记录。
git commit命令执行成功后会告诉你,1 file changed:多少个文件被修改;2 insertions:插入了什么内容。

为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:

$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."

二、基本操作

1.版本回退
查看历史记录

git log
如显示显示信息台多
git log --pretty=online

日志每天修改历史记录看到的一大串类似1094adb…的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。
每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线。

在Git中,用HEAD表示当前版本,也就是最新的提交1094adb…(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。

$ git reset --hard HEAD^
HEAD is now at e475afc add distributed

在git log中最新那条那条记录也会被删除

ps:如想退回被删的版本,找到对应的版本号

$ git reset --hard $HEAD  #版本号没必要写全,前几位就可以了,Git会自动去找。
HEAD is now at 83b0afe append GPL

找不到对应的版本号

git reflog #记录着你的每一次命令

2.工作区和暂存区
工作区(Working Directory):实质就是仓库的目录
版本库(Repository):工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
在这里插入图片描述

把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区stage
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支master
创建Git版本库时,Git自动为我们创建了唯一一个master分支,git commit就是往master分支上提交更改。

工作区中添加一个LICENSE文本文件

先用git status查看目录文件状态,如未add 状态为untracked

提交后,用git diff HEAD – readme.txt命令可以查看工作区和版本库里面最新版本的区别

3.撤销修改
如想撤销在工作区的文件的修改
git checkout – file可以丢弃工作区的修改:
一种是文件自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
另一种文件已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

撤销在暂存区的文件的修改
命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区

4.删除文件

在版本库中删除文件
git rm file 删掉,并且git commit -m "xxxx"

如删除错了版本库的文件
**$ git checkout – file **
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!

三、远程仓库

1.创建远程仓库
自行注册GitHub账号。由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的

创建SSH Key
如目录有.ssh id_rsa id_rsa.pub 三个文件 则可跳过第一步

$ ssh-keygen -t rsa -C "youremail@example.com"

在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以泄露.

登录Github
打开“Account settings”,“SSH Keys”页面,然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:点“Add Key”,你就应该看到已经添加的Key

2.从远程仓库克隆

$ git clone  库地址

四、分支master管理

1.创建合并分支
https://www.liaoxuefeng.com/wiki/896043488029600/900003767775424
流程:

  1. 创建切换分支
git checkout -b <new branch>
相当于
$ git branch <new branch>
$ git checkout <new branch>

常用的应该是
$ git switch -c <new branch>

  1. 查看分支 git branch 当前分支前面会标一个 * 号。
  2. 分支工作完成后,在readme中加修改信息,并提交
  3. 切回原来的master分支 $ git checkout mastergit switch <new branch>
  4. 合并新分支 $ git merge <new branch>
    Fast-forward信息,Git告诉我们,这次合并是“快进模式”
    合并完成后就可以删除新分支
    $ git branch -d <new branch>

Git鼓励大量使用分支:

查看分支:git branch

创建分支:git branch

切换分支:git checkout 或者git switch

创建+切换分支:git checkout -b 或者git switch -c

合并某分支到当前分支:git merge

删除分支:git branch -d

2.解决冲突

当本地的master比远程的master分支要超前1个提交。
合并分支后,git atatus也可以告诉我们冲突的文件
打开查看冲突的文件
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容

git log --graph命令可以看到分支合并图

3.分支管理策略

当合并时,git默认使用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。

准备合并dev分支,请注意–no-ff参数,表示禁用Fast forward:
$ git merge --no-ff -m “merge with no-ff” <new branch>
在这里插入图片描述

4.bug分支

当工作的分支工作未完成提交,并需要修改bug
Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
$ git stash
现在修复bug,需要把read me中…“Git is free software …”改为“Git is a free software …”,然后提交

刚才的工作现场存到哪去了?用git stash list命令看看:
$ git stash list
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了

恢复指定的stash,用命令:
$ git stash apply <stash@{0}>

如在master分支中修复了bug,但在其他分支也会存在
在master分支上修复的bug,想要合并到当前dev分支,可以用 git cherry-pick <commit>#commit为你提交后的编号 命令,把bug提交的修改“复制”到当前分支,避免重复劳动。在这里插入图片描述

5.Feature分支

当添加新功能时
$ git switch -c feature-xxx

当新分支还没合并就需要被销毁
$ git branch -d feature-vulcan 会提醒销毁失败
$ git branch -D feature-xxx

6.多人协作

当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
要查看远程库的信息,用
git remote
git remote -v 更详细的信息
上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址

推动分支
推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
$ git push origin master
如果要推送其他分支,比如dev,就改成:
$ git push origin dev

捉取分支
git clone xxxxx
只能看到本地的master分支

要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支:
$ git checkout -b dev origin/dev

在dev分支提交后,时不时地把dev分支push到远程
$ git push origin dev

最新提交和你试图推送的提交有冲突,解决办法也很简单,Git已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送
git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:
$ git branch --set-upstream-to=origin/dev dev
再git pull
但是合并有冲突,需要手动解决,解决的方法和分支管理中的解决冲突完全一样。解决后,提交,再push

多人协作的工作模式通常是这样:
首先,可以试图用git push origin 推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/。

当本地提交与远程提交有冲突
rebase操作可以把本地未push的分叉提交历史整理成直线,缺点是本地的分叉提交已经被修改过了;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

四、标签管理

标签tag也是版本库的一个快照。

1.创建分支

切换到对应分支**git tag <tag name>**就可以打一个新标签

git tag查看所有标签
默认标签是打在最新提交的commit上的

查看历史commit id
$ git log --pretty=oneline --abbrev-commit
然后给历史提交的
$ git tag <tag name> <commit id>

git show <tag name> 查看标签信息:

创建带有说明的标签,用-a指定标签名,-m指定说明文字:
$ git tag -a <tag name> -m “xxx” <commit id>

2.操作标签

删除标签:
$ git tag -d <tag name>

推送某个标签到远程,使用命令
git push origin <tagname>

一次性推送全部尚未推送到远程的本地标签:
$ git push origin --tags

如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
$ git tag -d <tagname>
然后,从远程删除。删除命令也是push,但是格式如下:
$ git push origin :refs/tags/<tagname>

六、配置别名

st就表示status:
**$ git config --global alias.st status 查看状态
$ git config --global alias.co checkout 切换
$ git config --global alias.ci commit 提交
$ git config --global alias.br branch 查看分支
$ git config --global alias.unstage ‘reset HEAD’ 把暂存区的修改撤销掉(unstage)
$ git config --global alias.last ‘log -1’ 其显示最后一次提交信息
**

搭建git服务器
https://www.liaoxuefeng.com/wiki/896043488029600/899998870925664

可视化git管理工具
SourceTree

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值