目录
目录
1.5.4 git commit 将暂存区的文件修改提交到本地仓库
1.5.8 git checkout -- file 将文件撤销回到最近一次修改的状态(补)
1.5.10 查看提交历史:git reflog(补,了解)
1.6.5 从远程仓库中抓取git fetch与拉取git pull
1.6.6 git push [remote-name] [branch-name] 推送到远程仓库
1.7.4 git push origin 分支名 推送至远程仓库分支
1.7.7 git branch -m 分支名 新的分支名 修改分支名
1.9.3 git push [remote] [tag] 将标签推送至远程仓库
1.9.4 git checkout -b [branch] [tag] 检出标签
1. Git常用命令
1.1 环境配置
当安装Git后首先要做的事情是设置用户名称和email地址。这是非常重要的,因为每次Git提交都会使用该用户信息
右键选择Git Bash Here(即在当前目录下打开一个命令行窗口)
- 设置用户信息
git config --global user.name “itcast”
git config --global user.email “hello@itcast.cn”
- 查看配置信息
git config --list
git config user.name
通过上面的命令设置的信息会保存在~/.gitconfig文件中
1.2 获取Git仓库
要使用Git对我们的代码进行版本控制,首先需要获得Git仓库
获取Git仓库通常有两种方式:
- 在本地初始化一个Git仓库
- 从远程仓库克隆
1.2.1在本地初始化一个Git仓库
执行步骤如下:
- 在电脑的任意位置创建一个空目录(例如repo1)作为我们的本地Git仓库
- 进入这个目录中,点击右键打开Git bash窗口
- 执行命令git init
如果在当前目录中看到.git文件夹(此文件夹为隐藏文件夹)则说明Git仓库创建成功
1.2.2从远程仓库克隆
可以通过Git提供的命令从远程仓库进行克隆,将远程仓库克隆到本地
命令形式为:git clone 远程Git仓库地址
1.3工作目录、暂存区以及版本库概念
- 版本库:前面看到的.git隐藏文件夹就是版本库,版本库中存储了很多配置信息、日志信息和文件版本信息等
- 工作目录(工作区):包含.git文件夹的目录就是工作目录,主要用于存放开发的代码
- 暂存区:.git文件夹中有很多文件,其中有一个index文件就是暂存区,也可以叫做stage。暂存区是一个临时保存修改文件的地方
- Workspace:开发者工作区,也就是你当前写代码的目录,它一般保持的是最新仓库代码。
- Index / Stage:缓存区,最早叫Stage,现在新版本已经改成index,位于.git目录中,它用来存放临时动作,比如我们做了git add或者git rm,都是把文件提交到缓存区,这是可以撤销的,然后在通过git commit将缓存区的内容提交到本地仓库
- Repository:仓库区,是仓库代码,你所有的提交都在这里,git会保存好每一个历史版本,存放在仓库区,它可以是服务端的也可以是本地的,因为在分布式中,任何人都可以是主仓库。
- Remote:远程仓库,只能是别的电脑上的仓库,即服务器仓库。
1.3.1 三者关系
1.4 Git工作目录下文件的两种状态
Git工作目录下的文件存在两种状态:
- untracked 未跟踪(未被纳入版本控制,即未被git进行管理)
- tracked 已跟踪(被纳入版本控制,即已被git进行管理)
- Unmodified 未修改状态
- Modified 已修改状态
- Staged 已暂存状态
这些文件的状态会随着我们执行Git的命令发生变化
1.5 本地仓库操作
1.5.1 git status 查看文件状态
也可以使用git status –s 使输出信息更加简洁
1.5.2 git add 将未跟踪的文件加入暂存区
将所有改动文件添加到缓存区:git add --all、git add .
如果你实在不确信哪些文件是改动过的,你只需要使用git add --all
git add --all
这个命令会将当前目录下包括子目录下所有改动的文件提交到暂存区,注意只包括改动的文件,不改动的不会放到缓存区。
这个命令还会把删除的文件也提交进去
如你在本地删除了min.c 这个命令会把删除信息也记录进去,然后在提交的时候把仓库里对应的min.c也删除掉,也就是说你在本地做的删除操作会被记录,提交仓库时会删除同样的文件,如果不想删除文件,可以使用git add .,注意后面有一个“.”点的符号,这个命令跟git add --all一样,但是不会记录删除操作。
最后别忘记使用git commit提交到仓库中
1.5.3 git reset 将暂存区的文件取消暂存
reset参数是重置命令
--hard是重置代码仓库版本
有三种模式
--soft 、--mixed以及--hard是三个恢复等级。
- 使用--soft就仅仅将头指针恢复,已经add的暂存区以及工作空间的所有东西都不变。
- 如果使用--mixed,就将头恢复掉,已经add的暂存区也会丢失掉,工作空间的代码什么的是不变的。
- 如果使用--hard,那么一切就全都恢复了,头变,aad的暂存区消失,代码什么的也恢复到以前状态。
1.回滚到指定历史版本
先使用git log查看历史版本
git log
在使用git reset --hard命令回滚
git reset --hard 要回滚id
2.回滚当前仓库指向的版本
上面我们说过,HEAD是指向当前仓库的,历史版本中可能有别的分支,我们只想迭代我们仓库的上一个版本,这个很简单,我们只需要用HEAD来指向就可以了
git reset --hard HEAD^
^代表上一个版本的意思,HEAD代表当前仓库的指向,当前HEAD指向master,就代表回滚到master上一次提交的版本
当然我们也可以使用另外一种方式来回滚到当前仓库的指定版本
git reset --hard HEAD~3
后面的~3,代表以当前版本为基数,回滚多少次。HEAD~3代表回滚master前三个版本
1.5.4 git commit 将暂存区的文件修改提交到本地仓库
注:要想提交某个文件,必须先将该文件提交到暂存区
注意M的颜色变化
git commit -m "注释"
在commit时需要使用-m命令来简写描述我们的信息,只需要简单描述此次的功能或修复bug等信息,不要像写注释那样写一大堆,不然将来在回滚代码或者查看历史版本时,很难审阅。
git commit 会为我们生成40位的哈希值,用于作为id,并把刚刚用git add添加到提交缓存区里的文件提交到本地仓库中,便于我们回滚,至此,这个文件就已经添加到本地仓库中了,同时本地仓库也迭代了一个版本。
git commit --amend
--amend:重写上一次的提交信息
提交了仓库,但是发现注释写错了,我们可以使用 --amend长命令选项来改写提交
输入上面的命令后会进入如下编辑器界面:
在界面中按下“i”即可进入编辑界面
修改完成后按下esc键,:wq保存退出即可
此时git log即可看到刚才修改的提交
可以看到没有生成新的版本号,而是直接改写了刚刚提交的注释
1.5.5 git rm 删除文件
删除文件后查看文件状态
删除命令操作执行完就已经默认到了暂存区
上面删除的只是工作区的文件,需要提交到本地仓库
若从文件夹中直接删除某个文件,如README.en.md,此时并没有提交到暂存区
需要先提交到暂存区后
1.5.6 将文件添加至忽略列表
一般我们总会有些文件无需纳入Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以在工作目录中创建一个名为 .gitignore 的文件(文件名称固定),列出要忽略的文件模式。下面是一个示例:
# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf
示例:
windows中不能直接创建 .gitignore 的文件
可以在命令行中使用Linux命令创建
1.5.7 git log 查看日志记录
按回车显示下条日志
- 按q退出查看日志
第一行的commit是哈希算法算出的id,分布式是没有一个主版本号的,它们都是用id来做标志的,同时用master作为主仓库,其它的分支怎么迭代都不会影响到master,
commit b9e3a0d708ee5a81ea5ff383c6dabe716eec8cf1 (HEAD -> master)
后面的head是指向的意思,表示这次提交到哪儿,head->master代表这次提交到master主仓库,如果是head->分支仓库则代表提交到分支仓库
Author是提交者是谁的意思,显示格式是:用户名 <邮箱>
Author: StephenZhou <stephenzhou@StephenZhou.www.malloc.pro>
Date的意思是提交时间,后面的+0800这个是格林尼治时间,代表当前是以哪儿的时间地作为基准,这是世界时间,用它来作为基数与当前所在地时差进行计算,包括地球自转等公式。
Date: Tue Dec 29 12:15:13 2020 +0800
最下面的就是注释了
test add new file "test.c"
如果觉得log打印内容过多,可以加上--pretty=oneline选项简洁输出
查看单个文件可回滚版本:git log filename
1.5.8 git checkout -- file 将文件撤销回到最近一次修改的状态(补)
checkout:切换参数,通常用来切换分支仓库
当我们在工作中修改了一个文件,猛然间发现内容好像改的不对,想重新修改,这个时又不知道自己改了什么代码,想撤销修改,有一个最简单的方法,就是git checkout -- file,注意中间要有“--”,checkout这个命令是切换分支的功能,关于它我们后面在细说,你现在只需要知道这个命令加上“--”可以用来将文件切换到最近一次的状态
注意这个恢复只能恢复到上一次提交的状态,如你刚提交了这个文件到仓库,随后你修改了它,那么使用这个命令只会回到刚刚提交后的那个状态里,不能回到你还没有提交,但修改的状态中。
(即,提交后你又修改了A-->A1,此时A1没有add和commit,可以恢复到A,若A1 add或commit后就不能恢复到A了)
下面这个演示,我将min.c文件修改了,并使用git checkout -- file回到了之前修改的状态
注意这个功能不能一直迭代恢复,如你恢复到了修改前的版本,你想再次回滚回滚到修改前在之前的版本是不行的。
1.5.10 查看提交历史:git reflog(补,了解)
git reflog可以查看当前版本库的提交历史,凡是对仓库版本进行迭代的都会出现在这个里面,包括你回滚版本都会出现在这个历史中
版权声明:本文为CSDN博主「17岁boy想当攻城狮」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bjbz_cxy/article/details/116703787
1.6 远程仓库操作
1.6.1 git remote -v 查看远程仓库
如果想查看已经配置的远程仓库服务器,可以运行 git remote 命令。 它会列出指定的每一个远程服务器的简写。 如果已经克隆了远程仓库,那么至少应该能看到 origin ,这是 Git 克隆的仓库服务器的默认名字
如下:wyy-repo2是从远程仓库克隆来的一个仓库
git remote -v 查看远程仓库信息
如下:repo1是自建的一个仓库,未与任何一个远程仓库建立联系
1.6.2 git remote add <shortname> <url> 添加远程仓库
运行 git remote add <shortname> <url> 添加一个新的远程 Git 仓库,同时指定一个可以引用的简写(注:本地仓库和远程仓库不是必须保持一致,但建议保持一致,规范)
一个本地仓库可以添加多个远程仓库
git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到本机分支中。
1.6.3 git clone 从远程仓库克隆
如果你想获得一份已经存在了的 Git 仓库的拷贝,这时就要用到 git clone 命令。 Git 克隆的是该 Git 仓库服务器上的几乎所有数据(包括日志信息、历史记录等),而不仅仅是复制工作所需要的文件。 当你执行 git clone 命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。
克隆仓库的命令格式是 git clone [url]
1.6.4 git remote rm 移除无效的远程仓库
如果因为一些原因想要移除一个远程仓库 ,可以使用 git remote rm
注意:此命令只是从本地移除远程仓库的记录,并不会真正影响到远程仓库
1.6.5 从远程仓库中抓取git fetch与拉取git pull
- git fetch 是从远程仓库获取最新版本到本地仓库,不会自动merge
注意此时只是从远程仓库获取到最新版本到本地仓库,即存储在.git文件夹中,并不会自动合并,即此时工作目录中还没有连接的远程仓库文件;
此时需要git merge origin/master来将远程仓库的文件合并到该文件夹下
- git pull 是从远程仓库获取最新版本并merge到本地仓库
- 效果就相当于fetch+merge
注意:如果当前本地仓库不是从远程仓库克隆,而是本地创建的仓库,并且仓库中存在文件,此时再从远程仓库拉取文件的时候会报错(fatal: refusing to merge unrelated histories ),解决此问题可以在git pull命令后加入参数--allow-unrelated-histories
1.6.6 git push [remote-name] [branch-name] 推送到远程仓库
当你想分享你的代码时,可以将其推送到远程仓库。
命令形式:git push [remote-name] [branch-name]
1.7 Git分支
几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。Git 的master分支并不是一个特殊分支。 它跟其它分支没有区别。 之所以几乎每一个仓库都有 master 分支,是因为git init 命令默认创建它,并且大多数人都懒得去改动它。
1.7.1 git branch 查看分支
- 列出所有本地分支 git branch
- 列出所有远程分支 git branch -r
- 列出所有本地分支和远程分支 git branch -a
1.7.2 git branch b1 创建分支
*表示当前处于哪个分支,即HEAD的指向
1.7.3 git checkout 分支名 切换分支
使用git checkout -分支名 切换分支
git checkout -b 分支名 创建一个分支,创建完成分支后会自动切换过去
git checkout -b dev
即等价于
git branch dev # git branch 如果后面跟着名字则会创建分支,但不会切换
gti checkout dev
git checkout的作用是检出,如果是文件的话,会放弃对文件的缓存区操作,但是要使用reset重置一下变更才行。
如果是分支的话会切换过去。
1.7.4 git push origin 分支名 推送至远程仓库分支
1.7.5 git merge 分支名 合并分支
如需要将b1分支中的文件合并到master分支中
- 首先将b1分支中要合并的内容提交到本地版本库
- 然后切换到master分支
- 再git merge b1
第一步:将b1分支中要合并的内容提交到本地版本库,具体如下图所示
第二步:切换到master分支,此时可以看到master分支中并没有b1分支中要合并的内容
第三步:git merge b1
有时候合并操作不会如此顺利。 如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没办法合并它们,同时会提示文件冲突。此时需要我们打开冲突的文件并修复冲突内容,最后执行git add命令来标识冲突已解决;
解决冲突步骤:
第一步:打开冲突文件
第二步:手动修改冲突文件
第三步:修改完成通过git add命令告诉已修改完成
这里需要说一点,如果你在任何分支下创建文件,没有提交到仓库,那么它在所有仓库都是可见的,比如你在分支dev中创建了一个文件,没有使用git commit提交,此时你切换到master,这个文件依旧存在的,因为你创建的文件在工作目录中,你切换仓库时git只会更新跟仓库有关的文件,无关的文件依然存放在工作区。
如:在dev分支中新建devTest.txt文件 ,没有使用git commit提交
在切换回master分支后,在工作目录仍能看到dev分支中新建devTest.txt文件
切换回dev提交后,再切换回master则在工作目录看不到devTest.txt文件
1.7.6 git branch -d 分支名 删除分支
注:此时并不会删除远程库中的b2分支
如果要删除的分支中已进行了一些开发动作,此时执行上面的删除命令并不会删除分支,如果坚持要删除此分支,可以将命令中的-d参数改为-D
如修改b1分支中的User.java文件后,要删除b1分支
如果要删除远程仓库中的分支,可以使用命令git push origin –d branchName
1.7.7 git branch -m 分支名 新的分支名 修改分支名
使用-m选项
git branch -m 分支名 新的分支名
1.7.8 git diff 查看不同分支的文件差异
1.8 综合应用
工作场景如下:
开发某个网站。 为实现某个新的需求,创建一个分支(dev)。 在这个分支上开展工作。 正在此时,你突然接到一个电话说有个很严重的问题需要紧急修补。 你将按照如下方式来处理: 切换到你的线上分支(master)。 为这个紧急任务新建一个分支(fix),并在其中修复它。 在测试通过之后,切换回线上分支(master),然后合并这个修补分支(fix),最后将改动推送到线上分支(master)。 切换回你最初工作的分支上(dev),继续工作
为实现某个新的需求,创建一个分支(dev)。
在这个分支上开展工作。
正在此时,你突然接到一个电话说有个很严重的问题需要紧急修补。 你将按照如下方式来处理:
切换到你的线上分支(master)。
为这个紧急任务新建一个分支(fix),并在其中修复它。
在测试通过之后,切换回线上分支(master),然后合并这个修补分支(fix),最后将改动推送到线上分支(master)。
切换回你最初工作的分支上(dev),继续工作
在开发中git分支的重要性
当我们在开发中,无论做什么操作都建议使用分支,因为在团队开发中,master只有一个,合作开发里任何人都可以从master里拉取代码,拉取时master后创建分支,分支名改为你要做的操作,比如修改某某文件,修改什么什么bug,单词以下划线做分割,然后在提交一个版本
分支名必须简洁,和标题一样,提交的commit在简单描述一下就可以了。
一般情况下,我们都是拉取master后,想要修改功能或者添加功能,都是创建分支,在分支里修改不影响master,如果修改错了代码或者误删之类的,在从master上拉取一份就可以了。
1.9 Git标签
像其他版本控制系统(VCS)一样,Git 可以给历史中的某一个提交打上标签,以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点(v1.0 、v1.2等)。标签指的是某个分支某个特定时间点的状态。通过标签,可以很方便的切换到标记时的状态。
1.9.1 git tag 列出已有的标签
- 列出所有tag git tag
- 查看tag信息 git show [tag]
1.9.2 git tag [tagName] 创建新标签
1.9.3 git push [remote] [tag] 将标签推送至远程仓库
- 提交指定tag git push [remote] [tag]
推送后
1.9.4 git checkout -b [branch] [tag] 检出标签
- 新建一个分支,指向某个tag git checkout -b [branch] [tag]
1.9.5 git tag -d [tag] 删除标签
- 删除本地tag git tag -d [tag]
- 删除远程tag git push origin :refs/tags/[tag]
删除本地tag
删除远程tag