git学习

Git简介

一、git的安装

1、在Linux上安装Git

sudo apt-get install git

2、在Windows上安装Git
在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。

安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
安装完成后,还需要最后一步设置,在命令行输入:

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

二、创建版本库

1、创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:

$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit

2、通过git init命令把这个目录变成Git可以管理的仓库:

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

瞬间Git就把仓库建好了,而且它是一个空的库,在目录下多了一个隐藏文件.git
三、把文件添加到版本库

1、编写一个readme.txt文件,内容如下:

Git is a version control system.
Git is free software.

一定要放到learngit目录下(子目录也行)
2、第一步,用命令git add告诉Git,把文件添加到仓库:

$ git add readme.txt

3、第二步,用命令git commit告诉Git,把文件提交到仓库:

$ git commit -m "wrote a readme file"
[master (root-commit) eaadf4e] wrote a readme file
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt

简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。

时光机穿梭

一、查看各种记录

1、git status命令可以让我们时刻掌握仓库当前的状态
2、如果git status告诉你有文件被修改过,用git diff可以查看修改内容。例:
在这里插入图片描述
(补:git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别)
3、如果你想查看提交日志(commit)记录,可以使用指令git log
我们commit了三次

版本1:wrote a readme file
Git is a version control system.
Git is free software.

版本2:add distributed
Git is a distributed version control system.
Git is free software.

版本3:append GPL
Git is a distributed version control system.
Git is free software distributed under the GPL.

使用git log

N402@DESKTOP-50UOCK1 MINGW64 /d/learnGit (master)
$ git log
commit 6806ab031df35cc557adc5ca95a82b256e3faac9 (HEAD -> master)
Author: Qingwen <1164874754@qq.com>
Date:   Sat Nov 23 10:38:09 2019 +0800

    append GPL

commit 71b42cdf87384e30dc43aa8d545db3a27f84e09d
Author: Qingwen <1164874754@qq.com>
Date:   Sat Nov 23 10:25:24 2019 +0800

    add distributed

commit f4ad0e97cd8c6e50bad3cf815ea3821fb0d71c7c
Author: Qingwen <1164874754@qq.com>
Date:   Sat Nov 23 10:10:53 2019 +0800

    Wrote a readme file

二、版本回退

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

1、HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id

2、穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

3、要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
(在git log指令出现版本历史后可以按ENTER键查看所有原来的版本)
例:

N402@DESKTOP-50UOCK1 MINGW64 /d/learnGit (master)
$ git log
commit 6806ab031df35cc557adc5ca95a82b256e3faac9 (HEAD -> master)
Author: Qingwen <1164874754@qq.com>
Date:   Sat Nov 23 10:38:09 2019 +0800

    append GPL

commit 71b42cdf87384e30dc43aa8d545db3a27f84e09d
Author: Qingwen <1164874754@qq.com>
Date:   Sat Nov 23 10:25:24 2019 +0800

    add distributed

commit f4ad0e97cd8c6e50bad3cf815ea3821fb0d71c7c
Author: Qingwen <1164874754@qq.com>
Date:   Sat Nov 23 10:10:53 2019 +0800

    Wrote a readme file

N402@DESKTOP-50UOCK1 MINGW64 /d/learnGit (master)
$ git reset --hard HEAD^
HEAD is now at 71b42cd add distributed

N402@DESKTOP-50UOCK1 MINGW64 /d/learnGit (master)
$ git reset --hard 6806ab
HEAD is now at 6806ab0 append GPL

N402@DESKTOP-50UOCK1 MINGW64 /d/learnGit (master)
$ git reflog
6806ab0 (HEAD -> master) HEAD@{0}: reset: moving to 6806ab
71b42cd HEAD@{1}: reset: moving to HEAD^
6806ab0 (HEAD -> master) HEAD@{2}: reset: moving to HEAD
6806ab0 (HEAD -> master) HEAD@{3}: commit: append GPL
71b42cd HEAD@{4}: commit: add distributed
f4ad0e9 HEAD@{5}: commit (initial): Wrote a readme file

三、工作区和暂存区

1、工作区(Working Directory)
就是你在电脑里能看到的目录

2、版本库(Repository)
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

3、我们把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
在这里插入图片描述

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支(master)。
在这里插入图片描述

四、撤销修改

1、场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

2、场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,git reset --hard HEAD^,不过前提是没有推送到远程库。

五、删除文件

如果你在工作区中用rm删除了某个文件,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了。
此时有两种选择:
1)确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit,然后文件就从版本库中被删除了
2)另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本

git checkout -- test.txt

远程仓库

一、创建github账户并与git ssh远程

第1步:
创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

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

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。

如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

第2步:
登陆GitHub,打开“Settings”:

点击"SSH and GPG keys" --> “New SSH key” --> 填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容 --> 点“Add Key”,你就应该看到已经添加的Key

二、添加远程库

现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。

1、首先,登陆GitHub,然后,在右上角找到“new repository”按钮,创建一个新的仓库;

2、在Repository name填入learnGit(仓库名字,一般与本地git仓库同名),其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库;

目前,在GitHub上的这个learngit仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。

3、我们根据GitHub的提示,在本地的learnGit(本机下的git仓库)仓库下运行命令:

$ git remote add origin https://github.com/yang-9520/learnGit.git

注意:把上面的yang-9520替换成你自己的GitHub账户名

添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

4、下一步,就可以把本地库的所有内容推送到远程库上:

$ git push -u origin master

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

注意:
从现在起,只要本地作了提交,就可以通过命令:

$ git push origin master

把本地master分支的最新修改推送至GitHub

三、从远程库克隆

1、克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆:

git clone git@github.com:Yang-9520/gitskills.git

注意:将地址改为相应的仓库地址

然后进入gitskills目录看看,已经有README.md文件了:

$ cd gitskills
$ ls
README.md

注意:如果有多个人协作开发,那么每个人各自从远程克隆一份就可以了。

你也许还注意到,GitHub给出的地址不止一个,还可以用https://github.com/michaelliao/gitskills.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。

使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。

分支管理

一、创建并合并分支

Git鼓励大量使用分支:

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>或者git switch <name>

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

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

删除分支:git branch -d <name>

二、解决冲突

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。

解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

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

三、分支管理策略

1、合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
例:

$ git merge --no-ff -m "merge with no-ff" dev

2、分支策略

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

所以,团队合作的分支看起来就像这样:
在这里插入图片描述
四、bug分支

1、软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交:
并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?

幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

$ git add new.txt
$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge

现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。

首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支:

$ git checkout master
$ git checkout -b issue-101

修复完成后,切换到master分支,并完成合并,最后删除issue-101分支。
2、接着回到dev分支干活了:

$ git checkout dev
Switched to branch ‘dev’

$ git status
On branch dev
nothing to commit, working tree clean

工作区是干净的,刚才的工作现场存到哪去了?用git stash list命令看看:

$ git stash list
stash@{0}: WIP on dev: f52c633 add merge

工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:

一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;

另一种方式是用git stash pop,恢复的同时把stash内容也删了:

$ git stash pop

再用git stash list查看,就看不到任何stash内容了:

$ git stash list

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;

在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

学习的链接:https://www.liaoxuefeng.com/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值