详说Git

1Git的概述

Git是一个分布式版本控制系统, 有本地库和远程仓库两部分
本地库就是由对象和引用构成的,Repositories
详说Git
图中的几个基本概念如下

• Workspace:你电脑本地看到的文件和目录,在Git的版本控制下,构成了工作区。
• Index/Stage:暂存区,一般存放在 .git目录下,即.git/index,它又叫待提交更新区,用于临时存放你未提交的改动。比如,你执行git add,这些改动就添加到这个区域啦。
• Repository:本地仓库,你执行git clone 地址,就是把远程仓库克隆到本地仓库。它是一个存放在本地的版本库,其中HEAD指向最新放入仓库的版本。当你执行git commit,文件改动就到本地仓库来了~
Remote:远程仓库,就是类似github,码云等网站所提供的仓库,可以理解为远程数据交换的仓库~
stash是用来暂存临时修改的栈, 有git stash和git stash pop两个命令

2.Git基础操作

详说Git
详说Git

使用git管理时, 工作区就是本地编辑代码的地方,修改后相应的文件状态会变为modified,但还没有将改动保存至数据区

先用git add 提交到暂存区,文件状态变为staged
再用git commit提交至本地仓库, git commit时需要添加commit信息, 这个也将是git log时的显示内容
提交至本地库的文件就已经是committed, 已经存储在了本地数据库中
紧接着使用git push 可以推送至远端仓库

上述操作中涉及到文件的状态变化,如下图所示
详说Git

• Untracked: 文件还没有加入到git库,还没参与版本控制,即未跟踪状态。这时候的文件,通过git add 状态,可以变为Staged状态
• Unmodified:文件已经加入git库, 没用做过修改
• Unmodified的文件如果被修改, 就会变为Modified. 如果使用git remove移出版本库, 则成为Untracked文件。
• Modified:文件被修改,这个状态通过stage命令/ git add进入staged状态
• staged:暂存状态. 执行git commit则将修改同步到库中, 本地与库中文件一致,变为Unmodified状态.

3.Git操作命令及状态流转

详说Git
git add 添加文件至暂存区

git add . 添加当前目录的所有文件到暂存区
git add [dir] 添加指定目录到暂存区,包括子目录
git add [file1] 添加指定文件到暂存区

git commit 提交修改至本地仓库

git commit -m [message] 提交暂存区到仓库区,message为说明信息
git commit [file1] -m [message] 提交暂存区的指定文件到本地仓库
git commit --amend -m [message] 使用一次新的commit,替代上一次提交

git status 查看工作区状态

git status 查看当前工作区暂存区变动
git status -s 查看当前工作区暂存区变动,概要信息
git status --show-stash 查询工作区中是否有stash(暂存的文件)
当你忘记是否已把代码文件添加到暂存区或者是否提交到本地仓库,都可以用git status看看哦~

git diff 查看差异

git diff 显示暂存区和工作区的差异
git diff HEAD 工作区和本地仓库的差异
git diff filepath filepath路径文件中,工作区与暂存区的比较差异
git diff HEAD filepath 工作区与HEAD ( 当前工作分支)的比较差异
git diff branchName filepath 当前分支的文件与branchName分支的文件的比较差异
git diff commitId filepath 与某一次提交的比较差异

git pull/git fetch 拉取远程仓库至本地

git pull 拉取远程仓库所有分支更新并合并到本地分支。
git pull origin master 将远程master分支合并到当前本地分支
git pull origin master:master 将远程master分支合并到当前本地master分支,冒号后面表示本地分支
git fetch --all 拉取所有远端的最新代码
git fetch origin master 拉取远程最新master分支代码
git fetch 这个操作是将远程库的数据下载到本地库,但是工作区中的文件没有更新。
git pull = fetch + merge

git push 推送至远程仓库

git push origin master 将本地分支的更新全部推送到远程仓库master分支。
git push origin -d branchname 删除远程branchname分支
git push --tags 推送所有标签

git commit 将暂存区修改提交至本地库

git commit -m “comment” 一般后面都会跟个 -m 加句 comment,简单说下改动的内容或者原因

git remote 查看及添加远程仓库

git remote 查看关联的远程仓库的名称
git remote add url 添加一个远程仓库
git remote show [remote] 显示某个远程仓库的信息

git checkout 如果文件还在工作区,还没添加到暂存区,可以使用git checkout撤销

git checkout [file] 丢弃某个文件file
git checkout - - file
git checkout . 丢弃所有文件

git log 查看提交历史

git log - -oneline 以精简模式显示查看提交历史
git log -p file 查看指定文件的提交历史
git blame file 一列表方式查看指定文件的提交历史,记录了某个文件的更改历史和更改人

git log 可以查看到提交过的信息,从近到远显示每次 commit 的 comment 还有作者、日期等信息,比如大概长这个样子:
commit 6k896dirg1gs9s0a7a91nfsagd8ay76875afs7d6
Author: XXX@xxx.com
Date: xxx xxx xxx
改了 Test 文件
commit 后面的这个编号,是每次历史记录的一个索引。比如如果需要对版本进行前进或者后退的时候,就需要用到它。
git reflog 更常用一些 , 显示当前分支的最近几次提交

4.Git进阶操作

1)git reset

git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本.
为了更好地理解git reset,我们来回顾一下,Git的版本管理及HEAD的理解
Git的所有提交,会连成一条时间轴线,这就是分支。如果当前分支是master,HEAD指针一般指向当前分支,如下:
详说Git
假设执行git reset,回退到版本二之后,变化如下,版本三不见了:
详说Git

git reset 的使用详解如下:
详说Git

git reset HEAD --file回退暂存区里的某个文件,回退到当前版本工作区状态
git reset –-soft <编号> 可以把版本库上的提交回退到暂存区,修改记录保留.[前面两个区不同步,就只有本地库跳到这个版本]
git reset –-mixed <编号> 可以把版本库上的提交回退到工作区,修改记录保留.[暂存区同步,工作区不动]
git reset –-hard <编号> 三个区都同步,可以把版本库上的提交彻底回退,修改的记录全部revert。

使用示例:

1.代码git add到暂存区,并未commit提交,可以采用:
git reset HEAD file 取消暂存git checkout file 撤销修改
2.,代码已经git commit了,但是还没有push:
git log 获取到想要回退的commit_id
git reset --hard commit_id 回到过去的commit_id
git reset –-soft <编号> 可以把版本库上的提交回退到暂存区
git reset –-mixed <编号> 可以把版本库上的提交回退到工作区,修改记录保留.
3.代码已经push到远程仓库,可以使用git reset 回滚
git log
git reset --hard commit_id
git push origin HEAD --force
详说Git

2)git revert 撤销修改

revert是撤销这个版本的修改,与git reset不同的是,revert复制了撤销修改后的版本,将它加在当前分支的最前端
详说Git
revert之后
详说Git

如果代码已经提交到远程,也可以考虑revert 回滚
git log 得到你需要回退一次提交的commit id
git revert -n <commit_id> 撤销指定的版本,撤销也会作为一次提交进行保存

3)分支与合并,merge与rebase

分支的基本操作

git branch 类似于ls,能够列出当前所有分支。
git branch -v 能够显示更多信息。
git branch branchName 创建分支
git checkout branchName 切换分支
git checkout -b branchName 创建的同时切换到相应分支
有了分支之后必然会有合并:
git merge [branchName] 合并分支

给远程建立分支

1.git branch branchName 本地新建分支
2.git push --set-upstream origin 本地分支

git merge 合并分支

假设有两个分支master和test
详说Git
执行git merge test 得到的结果
详说Git
---- merge 是 git pull 默认的选项

git rebase

合并其实还有另外一种方法:rebase,中文叫做变基
git rebase 的作用更多的是来整合分叉的历史,可以将某个分支上的所有修改都移到另一分支上,就像是变了基底

对master和test分支执行rebase得到的结果
详说Git

rebase好处是: 获得更优雅的提交树,可以线性的看到每一次提交,并且没有增加提交节点。
所以很多时候,可以用这个命令拉代码:git pull --rebase

解冲突

合并时就可能会有冲突
当在同一个文件的同一个位置修改时会有冲突

Git 解决冲突步骤如下:

• 查看冲突文件内容
• 确定冲突内容保留哪些部分,修改文件
• 重新提交,done

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,
<<<<<<<HEAD是指主分支修改的内容,>>>>>>> dev是指dev分支上修改的内容
发生冲突时,要确定到底保留哪个分支内容,还是两个分支内容都保留,然后再去修改文件冲突内容

tips

当想加一个新功能进去的时候,可以新建一个分支,例如名字叫newfunction,然后在分支中把新功能加上去,如果OK,将代码合并到master分支上,如果新功能失败,切换回master分支上来,在newfunction写的代码,又全看不到了

4. 标签tag

打tag就是对发布的版本标注一个版本号,如果版本发布有问题,就把该版本拉取出来,修复bug,再合回去。

git tag 列出所有tag
git tag [tag] 新建一个tag在当前commit
git tag [tag] [commit] 新建一个tag在指定commit
git tag -d [tag] 删除本地tag
git push origin [tag] 推送tag到远程
git show [tag] 查看tag
git checkout -b [branch] [tag] 新建一个分支,指向某个tag

上一篇:idea git stash


下一篇:常用git 指令