Git笔记

1 集中式和分布式

(1)CVS和SVN都是集中式版本控制器,工作时需要将代码从中央服务器中取下来,然后在修改,修改完成之后在存回中央服务器,整个过程需要连入网络。
(2)分布式无需联网,每个人的电脑都是一个完整的版本库,git还有一个强大的优点就是分支管理

2 Linux上安装Git

sudo apt-get install git

设置自己的帐号信息,因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。

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

3 创建版本库

创建一个版本库,可以理解为创建一个目录,这个目录里面的所有文件可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时候都可以追踪历史,或者在某个时刻还原。
(1)创建一个版本库,首先先创建一个空目录

$ mkdir learngit
$ cd learngit
$ pwd

(2)使用git init命令

git init

这样仓库就创建好了,可以使用ls -ah 命令看目录下是否有.git文件。

4 基本操作

git分为工作区和版本库区(暂存区和分支区)
git区
如图所示,Git为我们自动创建了第一个分支区,以及指向master的一个指针HEAD

4.1 最基本的本地推送命令
git init 创建一个版本库
git add filename 将文件从工作区添加到暂存区
git  commit -m “desciption" 将文件从暂存区添加到分支区,Git管理的是修改,使用此命令只是将暂存区的修改提交到分支区,如果工作区修改了,但是没有提交到暂存区,此命令是不是直接将工作区的修改直接提交到分支区的(不add到暂存区,就不会加入到commit中)
4.2 常用的辅助命令
git status 查看仓库的当前状态,使用该命令可以辨识文件是否提交到暂存区,以及是否从暂存区提交到分支区
git diff filename 查看文件修改内容,针对文件修改了,但是还为提交到暂存区。
git diff HEAD -- filename 查看工作区和版本库的不同
git log 查看提交的日志
git log --pretty=online 查看日志的简要信息
git reflog 查看历史命令,以便确定回到未来的那个版本号
4.3 撤销对工作区、暂存区、以及分支区的修改
git checkout -- filename 丢弃工作区的修改
git reset HEAD filename 使暂存区回到上一版本,丢弃对从工作区到暂存区的提交,工作区的修改还没有撤回,如果还需要对还原工作区的修改,需要再使用git checkout -- filename命令
git reset --hard commit_id 版本回到对应的commit_id版本,Git管理的是修改
4.4 对文件的删除操作
  • git rm filename 删除某个文件
  • git commit -m ”remove filename“ 提交对文件的删除

5 远程仓库

使本地库和GitHub库连接起来

5.1 需要创建SSH Key

在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C “youremail@example.com”

5.2 登录GitHub

没有帐号的申请一个,登录后,需要添加SSH keys。
打开“Account settings”,“SSH Keys”页面:然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。

之所以要添加SSH Keys,是因为需要识别出推送的提交是你推送的,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。

5.3 添加远程库

a. 登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库,在Repository name填入learngit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库。

b.在本地的lerngit仓库下运行命令

$ git remote add origin git@github.com:yourGitHubname/learngit.git 

远程库的名字叫做origin ,再用使用命令:

$ git push -u origin master

git push命令,实际就是把当前分支master推送到远程,-u 参数表示不但把本地的master分支内容推送上去,还会把本地的分支和远程的分支关联起来。在以后的推送和拉去就可以简化命令,以后可以直接使用如下命令

$ git push origin master

5.4 从远程库克隆

a.在GitHub上创建一个新的库,名字叫gitskills。勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。创建完毕后,可以看到README.md文件。

b.使用命令git clone

$ git clone git@github.com:yourGitHubname/gitskills.git

或git clone https://github.com/yourGitHubname/gitskills.git

6 分支

6.1 分支的创建与合并

最开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,每次提交,mater分支都会向前移动一步,当我们创建一个分支dev的之后,新建的指针dev将会指向master相同的提交,再把HEAD指向dev(HEAD是指向当前 分支的),就表示当前的分支在dev上了。之后对工作区的修改和提交就是针对dev分支了,master指针不变。完成了dev上的分支,可以把dev合并到master上,合并之后可以删除dev分支。

(1)分支的创建
git checkout -b dev 创将dev分支,并切换到dev分支上,相当于以下两条命令
git branch dev
git checkout dev
git branch  查看当前分支
(2)分支的合并
git merge dev 将dev分支的工作合并到master分支上,强制合并分支
git merge --no-ff -m "merge with no-ff" dev 普通模式合并分支
git branch -d <name> 删除name分支

分支的合并有时候还产生冲突,比如在master分支和dev分支同时对文件的同一地方进行了修改,这时候合并就会产生冲突。
分支冲突如下图所示
这里写图片描述
分支的合并冲突,只是对同一个地方进行的修改才会产生,对不同的地方修改是不会产生的,手动解决冲突内容后(更改内容 然后使用git add 和 git commit ),合并分支后,两个分支的内容将会是一样的。
强制合并和普通模式合并的区别,强制合并使用git log是看不出合并的信息的,普通模式合并可以看出合并信息
强制合并 git merge dev
这里写图片描述
普通合并 git merge –no-ff -m “merge with no-ff” dev
这里写图片描述

6.2 分支管理办法

  • master分支是非常稳定的,因此要时刻与远程同步
  • dev分支为开发分支,也需要与远程同步
  • bug用于修复本地的bug,就无需推到远程
  • feature分支为新功能开发

分支合并尽量使用普通模式合并 加上–no-ff参数,如果有个紧急任务需要修复一个bug,但是当前的开发任务又没有完成,可以使用如下办法进行现场保护

现场的保护常用命令集

git status 查看当前工作状态
git stash 将当前分支的工作状态“存储起来”,这时候使用git status是不会再显示该分支的工作状态了
git stash list 当重新切换回该分支时,使用该命令查看stash内容
git stash apply 恢复工作状态,但是stash内容并不删除
git stash drop 删除stash的内容
git stash pop 恢复工作状态,同时把stash内容删除,相当于上面的两条命令

7 标签

发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。
Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。

标签号可以代替commit_id

7.1 标签的创建

git tag <name> 用于新建一个标签,默认是HEAD,也可以指定一个commit_id
git tag -a <tagname> -m "description" 指定标签信息
git tag 查看所有标签
git show <标签号> 查看标签信息
git log --pretty=oneline --abbrev-commit 查看历史提交的commit_id

7.2 标签的操作

git push origin <tagname> 推送一个本地标签
git push origin --tags 推送全部为推送的标签
git tag -d <tagname> 删除一个本地标签
git push origin:refs/tags/<taname> 删除一个远程标签

问题

在github.com上 建立了一个小项目,可是在每次push 的时候,都要输入用户名和密码,很是麻烦

原因是使用了https方式 push

在termail里边 输入 Git remote -v

可以看到形如一下的返回结果

origin https://github.com/yuquan0821/demo.git (fetch)

origin https://github.com/yuquan0821/demo.git (push)

下面把它换成ssh方式的。

  1. git remote rm origin
  2. git remote add origin git@github.com:yuquan0821/demo.git
  3. git push origin

总结

本地推送命令

git init 创建一个版本库
git add filename 将文件从工作区添加到暂存区
git  commit -m “desciption" 将文件从暂存区添加到分支区,Git管理的是修改,使用此命令只是将暂存区的修改提交到分支区,如果工作区修改了,但是没有提交到暂存区,此命令是不会直接将工作区的修改直接提交到分支区的(不add到暂存区,就不会加入到commit中)

常用辅助命令

git status 查看仓库的当前状态,使用该命令可以辨识文件是否提交到暂存区,以及是否从暂存区提交到分支区
git diff filename 查看文件修改内容,针对文件未提交到暂存区。
git diff HEAD -- filename 查看工作区和版本库的不同
git log 查看提交的日志
git log --pretty=online 查看日志的简要信息
git reflog 查看历史命令,以便确定回到未来的那个版本号

撤销对工作区、暂存区、以及分支区的修改

git checkout -- filename 丢弃工作区的修改
git reset HEAD filename 使暂存区回到上一版本,丢弃对从工作区到暂存区的提交,工作区的修改还没有撤回,如果还需要对还原工作区的修改,需要再使用git checkout -- filename命令
git reset --hard commit_id 版本回到对应的commit_id版本,Git管理的是修改

对文件的删除操作

git rm filename 删除某个文件
git commit -m ”remove filename“ 提交对文件的删除

远程仓库

 git remote rm origin


ssh-keygen -t rsa -C "youremail@example.com" 创建SSH Key

git remote add origin git@github.com:yourGitHubname/learngit.git 添加远程库
git push -u origin master 推送master分支,git push命令,实际就是把当前分支master推送到远程,-u 参数表示不但把本地的master分支内容推送上去,还会把本地的分支和远程的分支关联起来。在以后的推送和拉去就可以简化命令,以后可以直接使用如下命令
git push origin master

$ git clone git@github.com:yourGitHubname/gitskills.git
或git clone https://github.com/yourGitHubname/gitskills.git

分支的创建

git checkout -b dev 创将dev分支,并切换到dev分支上,相当于以下两条命令
git branch dev
git checkout dev
git branch  查看当前分支

分支的合并

git merge dev 将dev分支的工作合并到master分支上,强制合并分支
git merge --no-ff -m "merge with no-ff" dev 普通模式合并分支
git branch -d <name> 删除name分支

分支现场保护

git status 查看当前工作状态
git stash 将当前分支的工作状态“存储起来”,这时候使用git status是不会再显示该分支的工作状态了
git stash list 当重新切换回该分支时,使用该命令查看stash内容
git stash apply 恢复工作状态,但是stash内容并不删除
git stash drop 删除stash的内容
git stash pop 恢复工作状态,同时把stash内容删除,相当于上面的两条命令

标签创建

git tag <name> 用于新建一个标签,默认是HEAD,也可以指定一个commit_id
git tag -a <tagname> -m "description" 指定标签信息
git tag 查看所有标签
git show <标签号> 查看标签信息
git log --pretty=oneline --abbrev-commit 查看历史提交的commit_id

标签操作
git reset –hard 回到标签版本
git push origin 推送一个本地标签
git push origin –tags 推送全部为推送的标签
git tag -d 删除一个本地标签
git push origin:refs/tags/ 删除一个远程标签

参考文献

廖雪峰 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值