Git常用命令
git概述:分布式的版本控制系统
1、版本控制系统:
(1)集群式版本控制(cvs svn)
(2)分布式版本控制(git):可以在公司的服务器放一份,自己学习的服务器放一份
git会给每一台计算机的用户分配版本控制权限,即可以查看自己文件的版本信息
版本控制服务器
github:国外网站,可以搭public类型的项目,private类型的若开发人员数大于四人则需要付费
gitlab:公司内部使用,可以搭建private类型的项目
svn:更新的版本只包含修改过的文件
git:更新的每一个版本都包含未修改的所有文件,回滚能够找到上一版本的所有文件
git的三种状态:工作区(unstaged)--add-->暂存区(staged)--commit-->本地仓库 --push--> git远程服务器
2、git常用指令1:
git init:在文件夹打开git bash输入该指令,会在该文件夹下生成一个.git的文件夹,代表则该文件夹被git管理,则可以将该文件夹上的文件(工程)推送到git远程 仓库进行管理,在推送前需要给计算机上安装的git和github配置SSH密钥,不然你怎么知道推送到哪个远程仓库呢?
git remote -v:查看本地文件夹所拥有的git远程仓库项目
第一次将本地工程上传到gitHub服务器:
git init: 将该文件夹(项目)给git管理
git add . :将该文件夹下所有修改过的文件(因为第一次上传,所有文件夹都是修改状态,都会提交)提交到暂存区
git commit -m "给本次提交加注释" : 添加提交注释修改了哪些内容
git remote add origin git@github.com:ibear2020/myFirstGitHub.git:将自己文件夹中的工程推送到GitHub服务器上存储
git push -u origin master:将代码上传到GitHub上的master分支。
3、git常用指令2:
git remote remove origin:如果因为一些原因想要断开和远程仓库的连接,我们可以先通过git remote -v查看远程仓库的信息,再通过该指令断开连接,origin为 当前文件夹对应的远程仓库的名称,断开连接之后Git远程仓库还存在该项目
rm -rf .git: 删除该目录下的.git文件夹以及子文件夹,则该文件夹将不再被git管理
touch hello.txt: 打开hello.txt文件,如若没有则创建一个hello.txt文件
git add . : 将工作区中的所有文件添加到暂存区
git add hello.txt : 将工作区中的hello.txt文件添加到暂存区
git commit -m '本次提交修改的内容说明': 添加提交注释修改了哪些内容
git restore --staged hello.txt : 将暂存区中的hello.txt文件删除,回退到工作区标记该文件为modified状态;如果你在add 文件之后再修改过该文件,则相当于只把 暂存区的该文件删除,内容并不会回退,想要内容回退到拉取时的版本得再用git checkout -- hello.txt命令;
git checkout -- file_name:将暂存区的文件内容回退到工作区,如果你add文件到暂存区后再修改该文件,用该指令会将暂存区的内容覆盖到工作区,但git status的状态还查询到该文件存在暂存区中
Tips: 如果将hello.txt add --> commit到了本地仓库,再修改了本地工作区上的hello.txt文件,则该文件仍在本地仓库将存在一个版本,如果此时git push 则是将该版本推送到git服务器,而不是修改后的版本,必须得重新add commit push
git log :查看提交日志
git status: 查看当前文件状态(modified),
(1)若在工作区修改过该文件,则该文件modified标记为红色;
(2)add到暂存区后标记为绿色;
(3)commit到本地仓库后,通过git status 查看,会有 Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)提示信息,提示你本地仓库有一个待push的操作;
git rm hello.txt: 删除文件,将该文件暂时删除到暂存区中
git reset head hello.txt: 将暂存区中文件删除状态从绿色更改为红色,再通过git checkout -- hello.txt取消删除;若删除该文件到暂存区后再 git commit --m '彻底删除',无论文件删除状态为绿色还是红色,都将彻底删除该文件
git commit --amend -m '更改提交日志':修改最近一次的提交操作的日志
git branch:查看分支
git branch new_branch_name: 创建分支
git checkout 分支名称:切换分支
git branch -d 分支名称:删除分支,自己分支不能删除自己,若该分支存在其它分支没有的文件则处于安全性考虑,删除操作失败,提示你先合并再删除
git branch -D 分支名称:强行删除分支,不会提示你进行合并到其他分支
git checkout sha1值:(1)通过sha1值切回到某次提交的版本,取回历史版本的文件;
(2)提交后的内容并不会对后续的commit有任何影响;是创建新分支的好时刻;
(3)要切过去的前提是当前工作区内容必须stash或者commit,一般只允许看看,修改必须提交;
git checkout master/dev:从当前分支切到master或dev分支的操作,以便拉取最新版本代码,(如果两个在同一个commit版本,有时修改后不用stash/commit也 可以直接切换过去;单建议保存现场)如果commi版本不一致则必须保存现场再通过checkout切换分支
git commit -am 'add和commit一并执行操作':该指令将会让add和commit操作合并为一步操作
git reset --hard HEAD^:(1)回退到上一个commit(一个^代表上一次的commit,两个^代表回退到前两次的commit) 可以回退到任意一次的commit,回退之后又想再前进回来到某次commit,只需要git reset --hard sha1,即可前进还原回来到某次commit,两者之间的commit也还存在和保留;
(2)如果git reset --hard sha1退回到某次commit后,则直接再pull的话本地工作区的工作进度会立马恢复为远程仓库最新工作进行;
(3)如果git reset --hard sha1退回到某次commit后,push -f 到远程服务器,git reset --hard sha1也可以再通过sha1值还原到某一次commit,且中间的commit记录不会被删除
git reflog:查看任意一次提交记录
git diff:可以查看两个文件之间的内容差异,一般用于
(1)比较工作区两文件之间的差距:diff a.txt b.txt 一般会对a文件产生提示信息,即加几行或者件哪行可以和b文件保持一致
(2)比较暂存区和工作区的区别:git diff
(3)比较个人仓库和工作区的文件差异:diff sha1(HEAD最近一次提交commit和工作区文件的区别)
(4)比较个人仓库和暂存区的文件差异:git diff --cached
.gitignore文件:该文件里面可以配置哪些文件你修改后不用提交
*properties !properties:忽略所有的properties文件,除了b.properties
4、Git设置计算机用户权限:
设置邮箱和用户名:三种方式
(1)git config --global (给当前计算机的所有用户设置)
(2)git config --system (给当前用户一次性设置)
(3)git config --local(只给当前项目进行设置)
给当前用户一次性设置
进入c盘的用户目录下(ibear文件夹),打开.gitconfig文件进行编辑
只给当前项目进行设置:切换到该项目的.git目录下右键打开git bash here或者通过编辑器打开config文件手动修改
git config --local user.name 'ibear2020'
git config --local user.email 'youemail@qq.com'
git config --local --unset user.name 删除用户名
5、合并和冲突
(1)合并:如果a.txt只存在master分支,但是不存在dev或者其他之外的分支,则删除该文件时,出于安全性考虑,会提示你先将该文件复制到其它分支
git merge new_branch :将当前所处分支的文件合并到new_branch分支
(2)冲突:
a.产生冲突的场景一:你们都拉取了最新的版本,但是修改了同一个文件,并且他先在你提交之前先提交,这时候会有冲突,一般我们每次要提代码的时候,都会先pull一下,但是现在你会发现pull也会报错,此时不要担心,只需将你修改的内容先add 再 commit到个人仓库,此时再pull会成功,并且会看到你们冲突的部分,解决冲突时,保留他修改和你修改的代码(不要乱删除别人修改的代码),解决完冲突后,将冲突的文件再add 和 commit 再push,就能提到远程仓库。
b.产生冲突的场景二:你们都拉取了最新的版本,但是修改了同一个文件的同时,他还给这个项目新增了一些新的文件,并且他先在你提交之前先提交,这时候会有冲突,一般我们每次要提代码的时候,都会先pull一下,但是现在你会发现pull也会报错,此时不要担心,只需将你修改的内容先add 再 commit到个人仓库,此时再pull会成功,并且会把他新增文件也下到你的工作区,并且此时可以看到你们同时修改的文件的冲突内容,解决冲突时,保留他修改和你修改的代码(不要乱删除别人修改的代码),解决完冲突后,将解决完冲突的文件和拉到你工作区新增的文件也需要再add 和 commit 再push,就能提到远程仓库。
c.解决冲突:
<<<<<head
你的修改
========
他的修改
>>>>>dev
(1)打开文件,删除<<<<<head 、 ========、>>>>>dev
(2)再保留内容,保留你的修改或者它的修改
(6)保存现场:
主要是用于分支间的切换,比如你在dev分支修改的内容还没commit,则这个时候你无法切换到到master分支,必须保存dev的现场,便于你从master切换过来后,继续修改。
git stash save "现场":保存当前工作进度为现场
git stash list: 查看现场记录 stash@{0}: On dev
git stash apply stash@{0}: 切换到该现场,保留现场内容, stash@{0} 是每一个现场的前缀
git stash pop stash@{0}: 切换到该现场还原内容后,再删除该现场
git stash drop stash@{0}: 删除该现场
(7)撤销指令:
撤销指令主要是用于对个人仓库和远程仓库的撤销操作,即你已经commit到个人仓库但是未push到远程仓库的commit进行撤销,或者你已经push到git远程仓库的commit进行撤销操作
(a)reset:
慎用,该操作用于回退到git远程仓库上的某次push操作,且该push之后的所有push操作将不再存在,此时你在git push -f,将会被强制删除将回退后的本地版本覆盖远程的版本,会对分支数据造成安全影响;
使用步骤:
git reset sha1值 :sha1为某次的commit/push的序列号
git push -f:表示将目前自己本机的代码库(即当前本地工作箭头所指向的工作进度)强制推送到远端,并覆盖git远程仓库的工作进度,具体就是你reset之后,本地的工作箭头会回退到sha1值对应的工作进度,此时你git log 你会发现该工作进度后面的所有的commit都将不存在;此时你git pull再git log你会看到远程仓库(origin/Head)和本地工作区(HEAD)工作进度的差别,如果你git push他会提示你push失败,必须通过git push -f指令;git pull -f (force)相当于将自己本地的工作路线覆盖远程仓库的工作路线,
(b)revert:
撤销个人仓库/git远程服务器上的某次commit,并生成一个新的撤销记录,并不会对该撤销的commit之后的commit有影响
使用步骤:
git revert sha1值: sha1为某次的commit/push的序列号,一般用于撤销本地仓库区中未push的操作,或者撤销已经push了的最新操作