赞
踩
一、什么是Git?
Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。
也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
简而言之,git就是一个版本管理库,也是一个版本管理工具,它的作用就是帮助我们记录版本信
息,以及修改内容。Git的结构是分布式的资源库,特点是没有严格的服务器概念,每个单体都可作为资源库。这个特点就让我们人人有自己的git仓库这件事变得容易实现。
二、Git的工作流程
Workspace:工作区,平时存放项目代码的地方。
Index / Stage:暂存区,用于临时存放改动信息,事实上它只是一个文件,保存即将提交到本地仓库的文件列表信息。
Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。
Remote:远程仓库 ,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换。
Git的工作流程:
1、在工作目录(Workspace)中添加、修改文件;
2、将需要进行版本管理的文件放入暂存区域(Index / Stage);
3、将暂存区域的文件提交到Git仓库。
本地git仓库结构
Directory:使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。
WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间。
.git:存放Git管理信息的目录,初始化仓库的时候自动创建。
Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。
Local Repo:本地仓库,一个存放在本地的版本库;HEAD只是当前的开发分支(branch)。
Stash:隐藏,是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态。
三、Git的安装和初次使用
从安装到新的工作区建立,其中包括注册账号邮箱等。
3.1、在Linux上安装Git
如果你碰巧使用的是Debian或者Ubuntu Linux,通过一条指令:
$ sudo apt-get install git
就可以直接完成Git的安装了,非常简单。
3.2、在windows上安装Git
一般我们都是在Linux下安装在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
3.3、Git仓库的构建
Git仓库的构建分两种方式,一种是管理当前的代码,给当前代码创建一个Git仓库,这种需要初始
化新仓库;还有一种是用clone克隆一个远程仓库到自己当前目录下,这种适合一群人维护一个仓库,也是常见的方式。下面分别介绍这两种获取命令。
3.3.1、Git初始化新仓库
1、要对现有的某个项目开始用 Git 管理,只需到此项目所在的目录,执 行:git init
2、参见3.4节设置好自己的用户名和邮箱
3、将当前需要跟踪的文件加到git仓库
- $ git init
- $ git status //看一下当前分支情况,以挑选需要加入跟踪文件
- On branch master
- No commits yet
- Untracked files:
- (use "git add <file>..." to include in what will be committed)
- cansend.sh
- led.sh
- net.sh
- test.sh
- tf.sh
- nothing added to commit but untracked files present (use "git add" to track)
- $ git add . //将当前所有文件加入到暂存区
- $ git commit -m " g2l laohua" //给当前的提交记录一下,例如我给第一次提交记录为g2l
- laohua
- $ git log //查看当前的提交信息
- commit ea86821eea0da18e36c10feed1e7cf0eab3e94b6 (HEAD -> master)
- Author: pmc <1263606262@qq.com>
- Date: Mon Jun 20 11:49:15 2022 +0800
- g2l laohua
- $ git branch //查看当前所在分支
- * master
3.3.2、克隆仓库到本地
一般我们需要克隆仓库都是在公司的远程仓库里获取,多半我们都已经有服务器账号且服务器上已
经有安装好的Git,我们可以使用git clone直接克隆,git clone后边直接放置需要克隆的仓库路径即可,例如我想克隆远程的okmx6ul源码仓库,克隆来的源码已经有跟踪文件,不需要额外再添加跟踪文件
$ git clone git@192.168.0.232:work/mx6ul
克隆完毕以后需要确认自己是否设置了用户名和邮箱,若没有参考3.4节设置。
3.4、设置用户名和邮箱
因为Git是分布式版本控制系统,所以每个机器都必须自报家门:你的名字和Email地址。每当我们在一个新的Git上,第一步我们需要做的就是创建自己的账户
- $ git config --global user.name "Your Name"
- $ git config --global user.email "email@example.com"
例如我把李明的名称和邮箱(liming@forlinx.com)添加进去
- $ git config --global user.name "LiMing"
- $ git config --global user.email "liming@forlinx.com"
#git config 命令的--global参数,用了这个参数,表示你这台电脑上边所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
注:名字使用全拼,Email地址需要使用真实邮箱。
3.5、Git目录介绍
3.5.1、.git目录介绍
初始化后,或者clone一个仓库后,在当前项目目录下会出现一个名为 .git 的目录,一般情况下看
不到.git 我们使用ls -a可以看到,所有 Git 需要的数据和资源都存放在这个目录中。如果你不想在项目中继续使用git直接将.git目录删除只保留项目文件即可。
- $ cd .git
- $ ls
- branches config description HEAD hooks info objects refs
上边代码块中是.git下的目录文件,下面一一介绍一下他们都是什么作用。
重点介绍config配置文件。
config (配置):该文件包含你的仓库配置,比如远程的url,你的邮箱和用户名等,每次你在控制台使用gitconfig都会在此产生影响,例如
- $ cat config
- [core]
- repositoryformatversion = 0
- filemode = true
- bare = false
- logallrefupdates = tru
- [remote "origin"]
- url = git@192.168.0.232:home/work/learngit.git
- fetch = +refs/heads/*:refs/remotes/origin/*
- [branch "master"]
- remote = origin
- merge = refs/heads/master
从上边可以看到url(远程仓库的地址),要是地址发生变更可以直接修改此文件。
description(描述)供gitweb[github的一种前身]使用,显示仓库的描述。
hooks(钩子)这是一个有趣的特性,Git提供了一套脚本,可以在每个有意义的Git阶段自动运行,这些被称为钩子的脚本可以在提交[commit],变基[rebase]拉取[pull]操作的前后运行,脚本命令预示着它的执行时机,
如我们可以编写pre-push的作为钩子,进行推送代码前的检查。
info(信息)你可以将不想被git管理的文件记录到.gitignore文件中,排除文件的意思是不进行共享这个文件,例如你不想共享你的IDE自定义配置,将其添加到.gitinore文件中即可
logs文件夹保持所有更新的记录,logs文件夹中有两个文件 refs文件夹和HEAD文件夹
refs文件夹下有三个文件夹:heads表示一系列的本地分支
remote远程仓库分支
tags: tag标签
HEAD文件夹:HEAD文件夹里面保持的是所有操作记录,使用git reflog查询的结果就是从HEAD文件夹里面来的 。
objects文件夹:存放着所有git对象,哈希值一共40位,前2位作为文件夹名称,后38位作为对象文件名
3.5.2、.gitignore的引入
为什么使用.gitignore?
在一些项目中,我们不想让本地仓库的所有文件都上传到远程仓库中,而是有选择的上传,比如:一些依赖文件(node_modules下的依赖)、bin 目录下的文件、测试文件等。一方面将一些依赖、测试文件都上传到远程传输量很大,另一方面,一些文件对于你这边是可用的,在另一个人那可能就不可用了,比如:本地配置文件。
为了解决上述问题,git 引入了 .gitignore 文件,使用该文件来选择性的上传文件。
使用规则
1.注释使用#开头
2.(1)忽略文件和目录,例如在.gitignore中添加了driver这个名字,此时会忽略掉当前项目中所有名为driver的文件和目录
(2)仅忽略文件,例如只想忽略以driver为名的文件,不想忽略以driver为名的目录,则在前一行输入driver然后在下一行输入!driver/如下
- $ cat .gitignore
- driver
- !driver/
(3) 仅忽略目录,当只想忽略当前目录下的driver目录,则在.gitignore中输入driver/ 当想忽略多级目录下的则在.gitignore中输入
*/*/driver
3.使用通配符
(1)星号"*":匹配多个字符;
(2)问号“?”:匹配除“/”外以外的任意一个字符;
(3)方括号“[xxxx]”: 匹配多个列表中的字符;
4.反向操作
使用“!”来避免某些文件不被跟踪
5.双星号
“/”斜杠后面紧跟两个连续的星号“**”,表示多级目录
6.其他规则
(1)空行不匹配任何文件;
(2)git跟踪文件,而不是目录;
(3)在.gitignore中,每行表示一种模式;
(4)如果本地仓库文件已被跟踪,那么即使在.gitignore中设置了忽略,也不起作用;
(5).gitignore文件也会被上传到远程仓库,所以,同一个仓库的人可以使用同一个.gitignore文件。
四、Git的常用命令索引
4.1、Git命令的使用方法
- $ git --help
- 用法 : git [--version] [--help] [-C <path>] [-c <name>=<value>]
- [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
- [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
- [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
- <command> [<args>]
- 下面为各种场合常见的 Git 命令:4.2、常用Git命令
- 4.2.1、克隆分支 git clone
- 主要是克隆其他路径或者远程的仓库,git clone后面跟克隆的仓库路径。
- 4.2.2、分支的常见操作
- 分支间的关系
- 几乎每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线。
- 使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
- 开始一个工作区(参见:git help tutorial)
- clone 克隆一个仓库到一个新目录
- init 创建一个空的 Git 仓库或重新初始化一个已存在的仓库
- 在当前变更上工作(参见:git help everyday)
- add 添加文件内容至索引
- mv 移动或重命名一个文件、目录或符号链接
- reset 重置当前 HEAD 到指定状态
- rm 从工作区和索引中删除文件
- 检查历史和状态(参见:git help revisions)
- bisect 通过二分查找定位引入 bug 的提交
- grep 输出和模式匹配的行
- log 显示提交日志
- show 显示各种类型的对象
- status 显示工作区状态
- 扩展、标记和调校您的历史记录
- branch 列出、创建或删除分支
- checkout 切换分支或恢复工作区文件
- commit 记录变更到仓库
- diff 显示提交之间、提交和工作区之间等的差异
- merge 合并两个或更多开发历史
- rebase 在另一个分支上重新应用提交
- tag 创建、列出、删除或校验一个 GPG 签名的标签对象
- 协同(参见:git help workflows)
- fetch 从另外一个仓库下载对象和引用
- pull 获取并整合另外的仓库或一个本地分支
- push 更新远程引用和相关的对象
- 命令 'git help -a' 和 'git help -g' 显示可用的子命令和一些概念帮助。
- 查看 'git help <命令>' 或 'git help <概念>' 以获取给定子命令或概念的
4.2、常用Git命令
4.2.1、克隆分支 git clone
主要是克隆其他路径或者远程的仓库,git clone后面跟克隆的仓库路径。
$ git clone git@192.169.0.232:imx6ul/kernel/linux-3.14.38.git/
4.2.2、分支的常见操作
分支间的关系
几乎每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线。
使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
Git 分支实际上是指向更改快照的指针。
创建分支
创建分支前需要确认你需要在哪个分支下创建
- $ git checkout -b test //在当前分支下切分支
- 在指定分支下切分支
查看当前分支
- *在哪个分支前,当前分支就是哪个
- $ git branch
- master
- * test
查看本地分支与远程分支(以remotes为开头的是远程分支)
- $ git branch -av
- feature_yaffs 68338dd add MOTORCOMM YT8512 PHY &&
- add C2 rtc
- * master 5bb7615 bug: yaffs release hidden
- space
- project_ATX137 40877ca modify lcd HV
- remotes/origin/HEAD -> origin/master
- remotes/origin/bugfix_ddr3_reduce 03dacb0 remove reduce ddr3 function
从远程拉取一个分支,这样本地就会有一个和远程分支一样的分支
$ git checkout -t remotes/origin/bugfix_ddr3_reduce
切换分支
当前在test分支,切换到master
$ git checkout master
然后再查看分支,可以看到当前分支已经切换到master
删除本地分支
若创建分支名称有问题需要删除,可以用如下命令
$ git branch -d test
当你再查看的时候已经已经没有test这个分支了
删除远程分支
注:不要删除远程分支
$ git push origin --delete [branch_name] //[branch_name]就是远程分支的名字
重命名本地分支
将本地分支name1更名为name2
$ git branch -m name1 name2
分支对比
- $ git diff //同一分支下暂存区和工作区做对比
- $ git diff 分支1 分支2 --stat //查看两个分支间的文件差异
- $ git diff 分支1 分支2 文件路径 //查看分支间某个文件的差异
分支合并
- 一旦某分支有了独立内容,你终究会希望将它合并回到你的主分支。 你可以使用以下命令将任何分支合
- 并到当前分支中去。以将project_test合并到master为例
-
- $ git branch //查看现有分支以及当前在哪个分支
- master
- * project_test
- project_xx
- $ git checkout master //将分支切到master
- $ git merge project_test //合并此分支到主分支上,如下打印显示合并情况
- Updating ea86821..5a26720
- Fast-forward
- led.sh | 2 +-
- tf.sh | 19 -------------------
- tmp.sh | 0
- tty.sh | 0
- 4 files changed, 1 insertion(+), 20 deletions(-)
- delete mode 100755 tf.sh
- create mode 100644 tmp.sh
- create mode 100644 tty
遇到冲突怎么办?
有时候合并操作不会如此顺利。如果你在两个不同的分支中,对同一个文件的同一个部分进行了不
同的修改,Git就没办法干净的合并他们。如下主分支和project_test由于对同一个文件的同一个部分进行了不同的修改,出现合并错误
- $ git merge project_test
- Auto-merging led.sh
- CONFLICT (content): Merge conflict in led.sh
- Automatic merge failed; fix conflicts and then commit the result.
此时 Git 做了合并,但是没有自动地创建一个新的合并提交。 Git 会暂停下来,等待你去解决合并
产生的冲突。你可以在合并冲突后的任意时刻使用 git status 命令来查看那些因包含合并冲突而处于未合并。
- $ git status
- On branch master
- You have unmerged paths.
- (fix conflicts and run "git commit")
- (use "git merge --abort" to abort the merge)
- Unmerged paths:
- (use "git add <file>..." to mark resolution)
- both modified: led.sh
- no changes added to commit (use "git add" and/or "git commit -a")
任何因包含合并冲突而有待解决的文件,都会以未合并状态标识出来。 Git 会在有冲突的文件中加
入标准的冲突解决标记,这样你可以打开这些包含冲突的文件然后手动解决冲突。 出现冲突的文件会包含一些特殊区段,看起来像下面这个样子:
- <<<<<<< HEAD
- echo 2 >
- /sys/class/leds/heartbeat/brightness
- sleep 1
- echo 0 >
- /sys/class/leds/heartbeat/brightness
- =======
- echo 1 >
- /sys/class/leds/heartbeat/brightness
- >>>>>>> project_test
这表示 HEAD 所指示的版本(也就是你的 master 分支所在的位置,因为你在运行 merge 命令的时候已经检出到了这个分支)在这个区段的上半部分(======= 的上半部分),而 project_test分支所指示的版本在======= 的下半部分。 为了解决冲突,你必须选择使用由 ======= 分割的两部分中的一个,或者你也可以自行合并这些内容。例如,你可以通过把上边这段内容换成下面的内容来解决冲突:
echo 1 > /sys/class/leds/heartbeat/brightness
上述的冲突解决方案仅保留了其中一个分支的修改,并且 <<<<<<< , ======= , 和 >>>>>>> 这些行被完全删除了。 在你解决了所有文件里的冲突之后,对每个文件使用 git add 命令来将其标记为冲突已解决。 一旦暂存这些原本有冲突的文件,Git 就会将它们标记为冲突已解决。
4.2.3、当前分支内的操作
以当前分支为“project_test”为例。
首先查看当前分支是否在project_test分支并切换到此分支,参见上边的分支查看和切换。
查看当前分支工作区是否干净,干净则进行修改工作
- $ git status
- On branch master
- Your branch is up to date with 'origin/master'.
- nothing to commit, working tree clean
修改源码,删除无用的tf.sh文件,添加新的文件tmp.sh和tty.sh
- $ ls
- cansend.sh laohua led.sh net.sh test.sh tf.sh
- $ rm tf.sh
- $ touch tmp.sh
- $ touch tty.sh
- $ ls
- cansend.sh laohua led.sh net.sh test.sh tmp.sh tty.sh
1.git追踪文件的添加和删除以及提交
修改完毕以后查看当前工作区状态
- $ git status
- On branch project_test
- Changes not staged for commit:
- (use "git add/rm <file>..." to update what will be committed)
- (use "git checkout -- <file>..." to discard changes in working directory)
- deleted: tf.sh
- Untracked files:
- (use "git add <file>..." to include in what will be committed)
- tmp.sh
- tty.sh
- no changes added to commit (use "git add" and/or "git commit -a")
从状态中可以看到当前分支,未提交的更改为tf.sh,tf.sh前面有一个delete 说明,tf.sh需要在git跟踪中被删除,还可以看到未被跟踪的文件为tmp.sh、tty.sh,因为这两个文件是新添加的,若需要添加到跟踪中,需要使用git add添加 ,如下操作
- $ git rm tf.sh
- $ git add tty.sh tmp.sh
- $ git status //从此处可以看到已经更改了的状态 删除了tf.sh 添加了新文件tmp.sh
- tty.sh
- On branch project_test
- Changes to be committed:
- (use "git reset HEAD <file>..." to unstage)
- deleted: tf.sh
- new file: tmp.sh
- new file: tty.sh
提交暂存区的文件到本地版本库
- $ git commit -m "change" //-m后面跟的是自己对此次提交的描述。此处是change
- [project_test 5a26720] change
- 3 files changed, 19 deletions(-)
- delete mode 100755 tf.sh
- create mode 100644 tmp.sh
- create mode 100644 tty.sh
将本地版本库的改动提交到远程
$ git push project_test //将project_test推送到远程
2.提交记录的查看
查看提交记录
- $ git log
- commit 5a267209d9e0669b634d65ed3d2ee72ee5c6b9ef (HEAD -> project_test)
- Author: pmc <1263606262@qq.com>
- Date: Tue Jun 21 16:21:32 2022 +0800
- change
- commit 118e07104db00a042c88bd49ae3041faa9705e95
- Author: pmc <1263606262@qq.com>
- Date: Mon Jun 20 14:36:32 2022 +0800
- led change
- commit ea86821eea0da18e36c10feed1e7cf0eab3e94b6 (project_xx, master)
- Author: pmc <1263606262@qq.com>
- Date: Mon Jun 20 11:49:15 2022 +0800
- the first
查看某次提交的修改
- $ git show 查看最新一次提交的具体修改内容
- $ git show [commitid] 查看某次提交的具体修改内容
- $ git show --stat 查看最新一次提交修改过的文件
- $ git show [commitid] --stat 查看某次提交修改过的文件
- $ git show [filename] 查看最新一次提交的某个文件的更改内容
- $ git show [commitid] [filename] 查看某次提交的某个文件的更改内容
3.commit回退
假设我们现在有三个提交C1~C3,现在HEAD指向C3,以此为例介绍不同情况下的回退命令
git rest --soft [HEAD]
使用此命令时,commit会回退到当前commit,但是当前commit之前已经提交的改动不会被删除会保存在暂存区,例如执行 $ git reset --soft HEAD~1
此时HEAD指向C2,当前C3的改变保存在暂存区,可以通过git status查看
此时只要再执行git commit -m "modify the information"就可以恢复到最开始的改动
git reset [HEAD]
使用此命令时,commit会回退到当前commit,但是当前commit之前已经提交的改动不会被删除而是被重置到了工作区。例如执行 $ git rest HEAD~1
此时HEAD指向C2,当前C3的改变重置到工作区,可以通过git status查看,会显示C3的改变还未add到暂存区,此时需要修改当前工作区,重新git add提交到工作区,再git commit -m “”重新提交到本地
git reset [HEAD]扩展命令
- $ git reset HEAD^ //回退所有内容到上一个版本
- $ git reset HEAD^ tty.sh //回退tty.sh文件的版本到上一个版本
- $ git reset [commitid] //回退到指定版本
git reset --hard [HEAD]
使用--hard参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交。当然也可以使用此命令,找到最新的commit号通过此命令再切换回来。
- $ git reset --hard HEAD~1 //回退到上一个版本
- $ git reset --hard HEAD~3 //回退上上上一个版本
- $ git reset --hard [commitid] //回退到某个版本回退点之前的所有信息
- $ git reset --hard origin/master //将本地的状态回退到和远程一样
git revert -n [commitid]
用于撤销之前的某一版本,但又想保留该目标版本后面的版本,并记录下这整个版本的变动流程
例如现在有三个版本,当前在C3,想要撤销C2的改动,但是需要保留C3的改动
- $ git log //日志版本
- commit 5a267209d9e0669b634d65ed3d2ee72ee5c6b9ef (HEAD -> master)
- Author: pmc <1263606262@qq.com>
- Date: Tue Jun 21 16:21:32 2022 +0800
- change
- commit 118e07104db00a042c88bd49ae3041faa9705e95 (led)
- Author: pmc <1263606262@qq.com>
- Date: Mon Jun 20 14:36:32 2022 +0800
- led change
- commit ea86821eea0da18e36c10feed1e7cf0eab3e94b6 (project_xx)
- Author: pmc <1263606262@qq.com>
- Date: Mon Jun 19 14:36:32 2022 +0800
- the first
- $ git revert -n 118e07104db00a042c88bd49ae3041faa9705e95 //此处若遇到冲突,则解冲突
- $ git commit -m "revert led change" //提交更改
git checkout [commitid]
此命令用于将某个commit切出当前分支,在此commit上进行操作查看编译等,但是不建议改动操作如下
- $ git checkout 118e07104db00a042c88bd49ae3041faa9705e95 //将此commit切出一个临时
- 分支
- $ git branch //查看当前分支情况
- * (HEAD detached at 118e071)
- led
- master
- project_test
- project_xx
- 同时根据自己的需求对此分支进行编译查看等操作,改动完毕以后切换回master
- $ git checkout master
- $ git branch //可以看到此分支已经消失
- led
- *master
- project_test
- project_xx
- 若想在某个commit切出分支,且需要进行改动提交等,需要如下操作
- $ git checkout 118e07104db00a042c88bd49ae3041faa9705e95 //将此commit切出一个临时
- 分支
- $ git branch //查看当前分支情况
- * (HEAD detached at 118e071)
- led
- master
- project_test
- project_xx
- $ git checkout -b project_learn //给此临时分支一个名字
-
-
- $ git branch //可以看到此分支不再是临时分支,可以在此分支上
- 重新提交更改
- *project_learn
- led
- master
- project_test
- project_xx
4.放弃工作区的修改-----未提交到暂存区
放弃工作区中的全部修改,清除完毕可以看到工作区已经为干净工作区
- $ git checkout .
- $ git status
- On branch project_test
- Your branch is up to date with 'origin/project_test'.
- nothing to commit, working tree clean
放弃工作区中的某个文件的修改使用git checkout -- [filename],再次用git status查看时,工作区的改动已经没有当前放弃的文件
- $ git status //查看当前工作区的状态
- On branch project_test
- Changes not staged for commit:
- (use "git add/rm <file>..." to update what will be committed)
- (use "git checkout -- <file>..." to discard changes in working directory)
- deleted: tf.sh
- Untracked files:
- (use "git add <file>..." to include in what will be committed)
- tmp.sh
- tty.sh
- no changes added to commit (use "git add" and/or "git commit -a")
- $ git checkout -- tty.sh //撤销对tty.sh的更改
- $ git status //查看当前工作区状态,发现工作区的改动已经没有tty.sh的记录了
- On branch project_test
- Changes not staged for commit:
- (use "git add/rm <file>..." to update what will be committed)
- (use "git checkout -- <file>..." to discard changes in working directory)
- deleted: tf.sh
- Untracked files:
- (use "git add <file>..." to include in what will be committed)
- tmp.sh
- no changes added to commit (use "git add" and/or "git commit -a")
5.放弃工作区的修改----已提交到暂存区
此处撤回建立在上面已经将所有改动加入暂存区,但是tty.sh文件更改有误想把此文件撤回,那么需要执行
git reset HEAD -- [filename] 然后再执行git status查看 此文件已经回到工作区可以重新更改再提交
- $ git status //查看工作区状态,改动已经提交到暂存区
- On branch project_test
- Changes to be committed:
- (use "git reset HEAD <file>..." to unstage)
- deleted: tf.sh
- new file: tmp.sh
- new file: tty.sh
- $ git reset HEAD -- tty.sh //撤销tty.sh的提交重新更改
- $ git status //查看当前的工作区状态,根据需求再安照工作区的方式对
- tty.sh进行更改
- On branch project_test
- Changes to be committed:
- (use "git reset HEAD <file>..." to unstage)
- deleted: tf.sh
- new file: tmp.sh
- Untracked files:
- (use "git add <file>..." to include in what will be committed)
- tty.sh
6.暂时隐藏操作----git stash
当你当前的分支暂存区或者工作区有改动还未提交,不允许直接切分支,需要放弃改动或者将改动提交到本地,才可切分支,但是你想要切到其他分支且不想放弃当前分支的改动,也不想临时提交,就可以使用此命令将当前提交到隐藏区,等其他分支处理好再回到此分支,将隐藏的修改拉回来。
需要注意的是 git stash 只能隐藏被跟踪的文件,不能隐藏新添加且还未被track的文件,若想隐藏未被track的文件需要先git add [filename] 添加到暂存区并被跟踪,才可以使用git stash隐藏。
常用命令
- git stash //执行隐藏操作命令
- git stash save "save message" //执行存储时,添加备注,方便查找,只有git stash 也要可以
- 的,但查找时不方便识别。
- git stash list //查看stash了哪些存储
- git stash show //显示做了哪些改动,默认show第一个存储,如果要显示其他存
- 贮,后面加stash@{$num},比如第二个 git stash show stash@{1}
- git stash show -p // 显示第一个存储的改动,如果想显示其他存存储,命令:git
- stash show stash@{$num} -p ,比如第二个:git stash show stash@{1} -p
- git stash apply //应用某个存储,但不会把存储从存储列表中删除,默认使用第一
- 个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git
- stash apply stash@{1}
- git stash pop //命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删
- 除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他
- stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop
- stash@{1}
- git stash drop stash@{$num} //丢弃stash@{$num}存储,从列表中删除这个存储
- git stash clear //删除所有缓存的stash
demo使用流程如下:
- $ git status //查看当前工作区情况,是干净的
- On branch project_test
- Your branch is up to date with 'origin/project_test'.
- nothing to commit, working tree clean
- $ touch 1.sh //对工作区修改,添加文件
- $ vim led.sh //对工作区修改,修改文件
- $ git status //查看工作区,当前工作区已有改动
- On branch project_test
- Changes not staged for commit:
- (use "git add <file>..." to update what will be committed)
- (use "git checkout -- <file>..." to discard changes in working directory)
- modified: led.sh
- Untracked files:
- (use "git add <file>..." to include in what will be committed)
- 1.sh
- no changes added to commit (use "git add" and/or "git commit -a")
- Dropped refs/stash@{0} (e898a4a649ee647eae02012329f4c1b6d23f7c54)
- $ git stash //隐藏更改
- $ git status //查看工作区情况,发现led.sh的改动被隐藏,因为led.sh为被追踪文件,但是没有
- 被追踪的1.sh文件不能被隐藏
- On branch project_test
- Untracked files:
- (use "git add <file>..." to include in what will be committed)
- 1.sh
- nothing added to commit but untracked files present (use "git add" to track)
- $ git add 1.sh //将1.sh提交到暂存区被跟踪
- $ git stash //隐藏更改
- $ git status //此时发现工作区已经干净
- On branch project_test
- nothing to commit, working tree clean
- $ git stash list //列举已经隐藏的信息
- stash@{0}: WIP on project_test: 311efbb shan shuo
- stash@{1}: WIP on project_test: 311efbb shan shuo
- $ git stash show //查看最新的隐藏具体改动
- diff --git a/1.sh b/1.sh
- new file mode 100644
- index 0000000..e69de29
- $ git stash apply stash@{0} //恢复stash{0}的改动
- $ git stash pop //恢复所有改
7.删除未被tracked文件----git clean
git clean 从你的工作目录中删除所有没有 tracked,没有被管理过的文件。
删除了就找不回了,一定要慎用。但是如果被 git add . 就不会被删除。
参数说明:
- n :显示将要被删除的文件,即当前没有被加入到管理和追踪的文件
- d :删除未被添加到 git 路径中的文件(将 .gitignore 文件标记的文件全部删除)
- f :强制运行
- x :删除没有被 track 的文件
8.本地Git的patch打入打出
什么是patch ?简单来说,patch中存储的是你对代码的修改。
在git中我们常用git format-patch和git am命令生成patch和打patch,用此方法获得的patch包含
commit里提交的code修改和commit信息,可以获取任意两个commit之间的patch。
git format-patch 生成patch
其中 代表具体commitid号
- $ git format-patch HEAD^ //生成最近的1次commit的patch
- $ git format-patch HEAD^^ //生成最近的2次commit的patch
- $ git format-patch HEAD^^^ //生成最近的3次commit的patch
- $ git format-patch HEAD^^^^ //生成最近的4次commit的patch
- $ git format-patch -1 <r1> //生成<r1>这个commit的patch
- $ git format-patch <r1> //生成<r1>这个commit以来的修改patch(不包含该
- commit)
- $ git format-patch --root <r1> //生成从根到r1提交的所有patch
- $ git format-patch <r1> <r2> //生成两个commit间的修改patch(包含这两个
- commit)
git am打patch
- $ git apply --stat 0001-limit-log-function.patch // 查看patch的情况
- $ git apply --check 0001-limit-log-function.patch // 检查patch是否能够打上,如果
- 没有任何输 出,则说明无冲
- 突,可以打上
- (注:git apply是另外一种打patch的命令,其与git am的区别是,git apply并不会将commit
- message等打上去,打完patch后需要重新git add和git commit,而git am会直接将patch的所有信息
- 打上去,而且不用重新git add和git commit,author也是patch的author而不是打patch的人)
- $ git am 0001-limit-log-function.patch //将名字为0001-limit-logfunction.patch的patch打上
- $ git am --signoff 0001-limit-log-function.patch // 添加-s或者--signoff,还
- 可以把自己的名字添加为signed off by信息,作用是注明打patch的人是谁,因为有时打patch的人并不
- 是patch的作者
- $ git am ~/patch-set/*.patch //将路径~/patch-set/*.patch 按照先后
- 顺序打上
- $ git am --abort
- // 当git am失败时,用以将已经在am过程中打上的patch废弃掉(比如有三个patch,打到第三个patch时
- 有冲突,那么这条命令会把打上的前两个patch丢弃掉,返回没有打patch的状态)
- $ git am --resolved //当git am失败,解决完冲突后,这条命令会接
- 着打patch
4.2.4、tag
- tag是git版本库的一个标记,指向某个commit的指针,tag主要用于发布版本的管理,一个版本发布
- 以后我们可以打上v1.0.0这样的标签。
- tag和branch的区别是。一个branch有一系列的commit,一个tag指向的是某个特定的commit,
- 这两个互相配合使用。例如:已经发布了v1.0 v2.0 v3.0三个版本,这个时候,我突然不想改现有代码的
- 前提下,在v2.0的基础上加个新功能,作为v4.0发布,就可以检出v2.0的代码作为一个branch,然后作
- 为开发分支。
- 此次简单介绍一下tag的常用指令
-
- $ git tag //查看已有标签
- v1.0.0
- $ git tag v1.0.1 //创建一个v1.0.1的标签
- $ git tag
- v1.0.0
- v1.0.1
- $ git tag -d v1.0.1 //删除一个tag的标签
- $ git show v1.0.0 //查看v1.0.0此版本的修改内容
- $ git push origin v1.0.0 //将标签v1.0.0推送到远程仓库
- $ git push origin --tag //将所有tag推送到远程
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。