git使用

git简介

Git比其他版本控制系统设计得优秀,是因为Git跟踪并管理的是修改的内容,而非文件本身。利用修改的内容对工作区的文件进行添加内容或删除内容,实现版本的重置。

git只要有四个区域

  • 工作区:是指git管理的某个项目目录
  • 暂存区:存放在 .git目录下,即.git/index,用于临时存放你未提交的改动
  • 本地仓库区:也为.git目录下,用于存放你提交的改动,可能有多个分支版本(默认是master),其中有head指针指向最新的版本
  • 远程仓库:类似github的远程仓库,用于多人协同工作

git本地仓库操作

创建本地git管理的目录

git init . #将当前目录设置git管理的目录
git config --global user.name “name“ #设置全局用户名
git config --global user.email mail #设置全局邮箱
git config --global --list #列出全局配置信息

[root@maoniu190 git-test]# git init .
Initialized empty Git repository in /home/alidata/git-test/.git/
[root@maoniu190 git-test]# ll -a
total 0
drwxr-xr-x 3 root root  18 Jan  8 14:16 .
drwxr-xr-x 4 root root  33 Jan  8 14:16 ..
drwxr-xr-x 7 root root 119 Jan  8 14:16 .git
[root@maoniu190 git-test]# git config --global user.name "panks"
[root@maoniu190 git-test]# git config --global user.email "pks1990@163.com"

git文件管理

git add 文件名						 #添加文件到暂存区
git commit -m “描述内容“				#将暂存区文件提交到本地版本库master
git status							#查看工作区中文件的状态

git push							#将工作区中版本库的主线推送到远程git服务中
git pull							#从远程git服务获取文件到本地

git branch 						#查看当前所处的分支


git add后,文件进入暂存区

git commit之后,文件进入当前分支的仓库

暂存文件 git add

目标若是新文件,则将新文件列为已跟踪状态,同时将文件放入暂存区
目标若是已跟踪文件(发生了修改),则将修改后的文件放入暂存区

提交文件 git commit
提交的时候,是把暂存区中的文件(而不是工作目录中的文件)进行提交到仓库中。所以,每次准备提交前,先用 git status 看下,是不是都已暂存起来了,然后再运行提交命令。每一次运行提交操作,都是对你项目作一次快照。
Git 提供了一个跳过使用暂存区域的方式,只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤。

查看文件状态 git status
文件状态有以下几种:

  1. Untracked files:未跟踪态,多是新文件;意味着Git在之前的快照(提交)中没有这些文件,Git不会自动将之纳入跟踪范围,除非git add将文件列为追踪状态。
  2. Changes to be committed:已暂存态,在暂存区状态等待被提交状态(多git add后,文件此时已放入暂存区)。
  3. Changes not staged for commit:已跟踪但未暂存态,已跟踪文件的内容发生了修改后还没有放到暂存区。若要暂存此次修改后的,需要运行 git add
    命令把他放到暂存区

查看文件差异 git diff
此命令比较的是工作目录中当前文件和暂存区域快照(git commit了的文件)之间的差异内容。
若要看已经暂存区文件和上次提交时的快照之间的差异,可以用 git diff --cached 命令

[root@maoniu190 git-test]# vim test1401 
[root@maoniu190 git-test]# git diff
diff --git a/test1401 b/test1401
index aa10053..f3aef69 100644
--- a/test1401
+++ b/test1401
@@ -1 +1,2 @@
 1420
+1422
## 上面为工作区的文件添加一行新内容,通过比较工作区和暂存区可以看出两者的差异


[root@maoniu190 git-test]# git add test1401 
[root@maoniu190 git-test]# git diff
[root@maoniu190 git-test]# git diff --cached
diff --git a/test1401 b/test1401
index aa10053..f3aef69 100644
--- a/test1401
+++ b/test1401
@@ -1 +1,2 @@
 1420
+1422
##将工作区的文件提交到暂存区后,git diff 命令可以看出工作区和暂存区没有差异
##通过git diff --cached比较暂存区和仓库区的差异


[root@maoniu190 git-test]# git commit -m '增加了第二行内容'
[master e823060] 增加了第二行内容
 1 file changed, 1 insertion(+)
[root@maoniu190 git-test]# git diff --cached
[root@maoniu190 git-test]# git diff 

忽略文件
一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表,那么我们可以创建一个名为.gitignore的文件,列出要忽略的文件模式。

删除文件
在暂存区中删除,并且不再跟踪此文件,可以用 git rm 命令完成,默认会连带从工作目录中删除指定的文件。

如果文件已暂存但未提交,此时又对工作区的文件进行了修改,那么执行git rm 会被阻拦防止误删文件导致修改的内容丢失,如果仍执意完成git rm需要加-f选项。

如果仅在暂存区中删除,不删除工作目录中。可以添加–cached选项

注意完成暂存区的删除操作,仍需要通过git commit将删除内容提交给仓库。

git版本管理

git log             #查看git commit的日志,该日志只记录提交的情况
git reflog 			#查看版本仓库的详细日志,该日志除了记录commit事件也会记录reset回滚事件

版本重置
使用命令git reset --hard commit_id。可以实现Git版本重置到指定历史版本号,内容包括

  • 工作区和暂存区中的文件都进行重置,与指定版本号中的仓库文件相同
  • git log 重置到指定版本号提交时的记录

注意1 git reflog不会重置,扔继续记录本次重置事件
注意2 git reset --hard 慎用,如果工作区有未提交的修改,一旦执行git reset --hard将工作区文件重置后,该修改部分将无法找回。

撤销修改
场景1:当你改乱了工作区某个文件的内容,但未add添加到暂存区时,想直接丢弃工作区的修改恢复到暂存区里内容情况,可以用命令git checkout – FILENAME。

场景2:当你不但改乱了工作区某个文件的内容,而且将其添加到了暂存区时,如果想丢弃修改,分两步,第一步用命令git reset HEAD – FILENAME 完成暂存区的回退,这就回到了场景1;第二步按场景1操作。(HEAD是通过git reflog获得)

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本重置,不过前提是没有推送到远程库。

git远程仓库操作

要想使用远程仓库需事先和它建立一个连接关系

在本地的工作目录下运行命令:
git remote add origin git@github.com:panks0823/linux-pks
此命令将建立一个与github上指定的仓库的连接,并在本地为远程仓库取别名origin。

将本地仓库的内容推送到远程仓库
以github为例,先在github上创建空白仓库,建议通过SSH密钥完成认证。

git push -u origin master:
将本地仓库的master分支内容推送到别名为origin的远程仓库上。

从远程仓库克隆到本地
git clone git@github.com:panks0823/linux-pks
使用此命令,会在本地新建一个目录linux-pks,用此目录作为工作目录,并且其中有一个.git的隐藏目录存储仓库信息。

从远程仓库更新本地代码
当本地仓库与远程仓库建立连接后,想要拉取远程仓库的代码,可以使用git fetch。如果想要拉取代码并直接合并到本地,可以使用git pull

git pull  拉取远程仓库所有分支更新并合并到本地分支。
git pull origin master 将远程master分支合并到当前本地分支
git fetch --all  拉取所有远端的最新代码
git fetch origin master 拉取远程最新master分支代码

git的分支操作

分支的作用:产生多个相互隔离的分支,以便多人协作修改自己所负责的部分时也不会相互影响,而且仍能利用自己所处的分支实现保存修改,撤销修改。

git通过二层指针方式来管理多分支。如图
在这里插入图片描述

图中的圆点表示一个工作区状态点(记录工作区里有什么文件,和这些文件内容)
第二层指针,就是各分支的名字,指向目前各分支中自己的工作区的状态点。
第一层指针,就是head,指向第二层指针

注意:工作区状态点,这个概念是自己理解所设。与分支版本号概念不同,无法通过git log 查到

创建与合并分支

#首先,我们创建dev分支并切换到dev分支
[root@maoniu190 git-test]# git checkout -b dev
Switched to a new branch 'dev'

#查看当前所在的分支,当前分支前面会标一个*号:
[root@maoniu190 git-test]# git branch
* dev
  master
[root@maoniu190 git-test]# ls
test1401

此时分支图如下:
在这里插入图片描述

#在dev分支上创建文件readme.txt并提交仓库
[root@maoniu190 git-test]# touch readme.md
[root@maoniu190 git-test]# git add readme.md
[root@maoniu190 git-test]# git commit -m "创建新文件readm"
[dev 4dd6c23] 创建新文件readm
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 readme.md
[root@maoniu190 git-test]# git status
# On branch dev
nothing to commit, working directory clean

此时分支图如下:
在这里插入图片描述

#切回到master分支 发现并没有readme.md文件,体会到分支的强大了吧
[root@maoniu190 git-test]# git checkout master
Switched to branch 'master'
[root@maoniu190 git-test]# ls
test1401

此时分支图如下:
在这里插入图片描述

#把dev分支的工作成果合并到master分支上,现在在查看工作区,就能看的readme.txt文件的存在了
[root@maoniu190 git-test]# git merge dev
Updating e823060..4dd6c23
Fast-forward
 readme.md | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 readme.md
[root@maoniu190 git-test]# ls
readme.md  test1401

此时分支图如下:
在这里插入图片描述

解决分支冲突

当在master分支和feature分支下分别修改文件,并发送提交,这时候的工作区状态点如下:
在这里插入图片描述

如果两个分支修改的内容不冲突,那么可以通过git merge快速合并成功。
如果两个分支修改的内容冲突(即同一文件名,但文件的内容不相同),那么无法快速合并成功,报错如下:

[root@maoniu190 git-test]# echo 'new name' > readme.md
[root@maoniu190 git-test]# git add .
[root@maoniu190 git-test]# git commit -m 'new name on master'
[master c472b78] new name on master
 1 file changed, 1 insertion(+), 1 deletion(-)
[root@maoniu190 git-test]# cat readme.md 
new name
[root@maoniu190 git-test]# git checkout dev
Switched to branch 'dev'
[root@maoniu190 git-test]# echo 'new name1'>readme.md 
[root@maoniu190 git-test]# git add .
[root@maoniu190 git-test]# git commit -m 'new name1 on dev'
[dev 11ef026] new name1 on dev
 1 file changed, 1 insertion(+), 1 deletion(-)
[root@maoniu190 git-test]# cat readme.md 
new name1
[root@maoniu190 git-test]# git checkout master
Switched to branch 'master'
[root@maoniu190 git-test]# git merge dev
Auto-merging readme.md
CONFLICT (content): Merge conflict in readme.md
Automatic merge failed; fix conflicts and then commit the result.
[root@maoniu190 git-test]# cat readme.md 
<<<<<<< HEAD
new name
=======
new name1
>>>>>>> dev

此时查看文件内容如下,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容

我们只能先解决冲突,解决方法就是把Git合并失败的文件,手动编辑为我们希望的内容,再提交。
注意:被合并的分支下的该文件并不会发送改变,此时应当删除被合并的分支 git branch -d。

开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除

分支暂停

场景:
dev分支修改完一部分, 还不具备提交的条件,但需要切换到master分支修改bug,这时候可以对dev分支进行暂停。

[root@maoniu190 git-test]# git checkout -b dev
Switched to a new branch 'dev'
[root@maoniu190 git-test]# echo '2st dev' > readme
[root@maoniu190 git-test]# git status
# On branch dev
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	readme
nothing added to commit but untracked files present (use "git add" to track)

错误做法:此时直接切换回master,会发现master分支上的文件和dev上的一样

[root@maoniu190 git-test]# git checkout master
Switched to branch 'master'
[root@maoniu190 git-test]# cat readme
2st dev

正确做法:应当在dev分支上先进行文件追踪(git add),接着暂停(git stash),将dev分支的工作区状态点记录起来,然后切换master分支。

[root@maoniu190 git-test]# git add readme
[root@maoniu190 git-test]# git stash
Saved working directory and index state WIP on dev: f45cf9f 正式提交
HEAD is now at f45cf9f 正式提交
[root@maoniu190 git-test]# git checkout master
Switched to branch 'master'
[root@maoniu190 git-test]# ls  ##并不存在readme文件
readme.md  test1401

等master分支处理结束后,切到dev分支上。通过git stash list 查看之前的记录。
一是用git stash apply恢复,但是恢复后, stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了

[root@maoniu190 git-test]# git checkout dev
Switched to branch 'dev'
[root@maoniu190 git-test]# git stash list
stash@{0}: WIP on dev: f45cf9f 正式提交
[root@maoniu190 git-test]# git stash apply 
# On branch dev
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	new file:   readme
#
[root@maoniu190 git-test]# ls
readme  readme.md  test1401
[root@maoniu190 git-test]# cat readme
2st dev
[root@maoniu190 git-test]# git stash list
stash@{0}: WIP on dev: f45cf9f 正式提交
[root@maoniu190 git-test]# git stash pop
# On branch dev
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	new file:   readme
#
Dropped refs/stash@{0} (76432034aaa560d0a1c06f164d8e7453227f246d)
[root@maoniu190 git-test]# git stash list
[root@maoniu190 git-test]# 

注意如果切回master分支时修改的是文件a,而在dev分支上git stash之前修改的也是文件a。建议舍弃dev分支,重新建立。因为master修改过的文件a不会被dev分支继承。

多人协作

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值