git的使用规范及技巧总结

一、什么是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推送到远程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

six2me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值