https://www.liaoxuefeng.com/wiki/896043488029600
把一个文件放到Git仓库只需要两步。
//第一步,用命令git add告诉Git,把文件添加到仓库:
$ git add .
//第二步,用命令git commit告诉Git,把文件提交到仓库
$ git commit -m "更新"
版本回退
//这里有修改过几个版本的例子
//版本一
<div>
try //commit -m finish
</div>
//版本二
<div>
try
我修改过了 //commit -m "修改"
</div>
//版本三
<div>
try
我修改过了
我又改过了 //commit -m "再次修改"
</div>
git log命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是"再次修改",
上一次是"修改",最早的一次是"finish",每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线:
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:
看到的一大串类似f94f3...的是commit id(版本号)
好了,现在我们启动时光穿梭机,准备把change.html回退到上一个版本,也就是commit提交说明 "修改" 的那个版本,怎么做呢?
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交f94f3...(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。
在,我们要把当前版本append GPL回退到上一个版本"修改",就可以使用git reset命令:
//回退到这个版本了
<div>
try
我修改过了
</div>
还可以继续回退到上一个版本 "再次修改",不过且慢,然我们用git log再看看现在版本库的状态:
最新的那个版本append GPL已经看不到了!好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?
办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个 "再次修改"的commit id是f94f3...,于是就可以指定回到未来的某个版本
版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
再小心翼翼地看看change.html的内容:
//指定回到未来的某个版本
<div>
try
我修改过了
我又改过了
</div>
现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?
Git提供了一个命令git reflog用来记录你的每一次命令:
从输出可知, "再次修改"版本的commit id是f94f351,现在,你又可以乘坐时光机回到未来了。
版本回退小结:
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
工作区和暂存区
工作区(Working Directory)
就是你在电脑里能看到的目录,
版本库(Repository)
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
俗话说,实践出真知。现在,我们再练习一遍,先对chang.html做个修改,比如加上一行内容:
<div>
try
我修改过了
我又改过了
我再改过了
</div>
然后,在工作区新增一个try.html(内容随便写)。
先用git status查看一下状态:
Git非常清楚地告诉我们对chang.html被修改了,而try.html还从来没有被添加过,所以它的状态是Untracked(未跟踪),表示还没add。
现在,暂存区的状态就变成这样了:
现在,使用命令git add,把chang.html和try.html都添加后,用git status再查看一下:
所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,然后$ git commit -m "增加了try.html" 就可以一次性把暂存区的所有修改提交到分支。
现在版本库变成了这样,暂存区就没有任何内容了:
管理修改
现在,假定你已经完全掌握了暂存区的概念。下面,我们要讨论的就是,为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。
你会问,什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。
为什么说Git管理的是修改,而不是文件呢?我们还是做实验。第一步,对chang.html做一个修改,比如加一行内容:
<div>
try
我修改过了
我又改过了
我再改过了
我增加了一行
</div>
然后,添加:
$ git add readme.txt
$ git status
然后,再修改chang.html:
<div>
try
我修改过了
我又改过了
我再改过了
我增加了一行
我再再改过了
</div>
提交:commit
提交后,再看看状态:
git status
咦,怎么第二次的修改没有被提交?
第一次修改 -> git add -> 第二次修改 -> git commit
小结
现在,你又理解了Git是如何跟踪修改的,每次修改,如果不用git add到暂存区,那就不会加入到commit中。
撤销修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file(文件名)
。
场景2:现在假定是凌晨3点,你不但写了一些胡话,还git add到暂存区了:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,庆幸的是,在commit之前,你发现了这个问题。用git status查看一下,修改只是添加到了暂存区,还没有提交,想丢弃修改,分两步,第一步用命令git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
删除文件
在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件del.html到Git并且提交:
$ git add test.txt
$ git commit -m "add test.txt"
//另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
git分支
git branch 查看当前分支
在命令行创建分支:
git branch dev创建分支,dev为创建的分支名
git checkout dev 切换分支,dev为分支名
删除分支:git branch -d dev dev为分支名
不能删除当前分支,需要切换到其他分支,再删除
创建分支:切换分支 :往切换到的分支添加内容 然后git add .
git commit -m 123
git pull
git push --set-upstream origin test(分支名字),第一次push一定要添加 --set-upstream origin test(分支名字),是为了关联该分支,然后添加的内容就是push到test这个分支了。
也可以创建分支 ,切换分支 ,
然后git add .
git commit -m 123
git pull
git push --set-upstream origin test(分支名字),
下次切换到该分支,再添加内容 ,然后四步骤也行
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
码云创建分支:
选择分支,然后clone
直接指定clone某个分支:
git clone -b xxx .git地址 xxx为分支
克隆后把它放到新创建的分支(注意克隆之后记得退出git,重新进入根目录打开git在运行命令):
下面这样就把克隆下来的项目放到自己新创建的分支了
第二:克隆之后创建自己的分支,然后切换到自己的分支,现在我就可以通过git pull origin 拉远程分支的代码到自己的分支了。
创建的第一次push需要git push --set-upstream origin dev-zhang关联自己的分支
查看pull远程分支:
$ git branch -a 查看远程分支
$ git pull origin dev 拉远程分支代码 dev为分支名
如果报这个错fatal: Authentication failed for 'http://git.jidiankj.cn/ydk/ydk-manager.git/'
在 git 输入 git config --system --unset credential.helper
会弹框输入gitlab账户密码 $ git pull origin dev
$ git add .
$ git commit -m 123
生成密钥:
git config --global user.name
git config --global user.email
生成密钥:
cd ~/.ssh/
ssh-keygen -t rsa -C "xx@qq.com"(邮箱是绑定gitlap账号的邮箱)
找到.shh文件,用记事本打开id_rsa.pub文件
然后点击生成密钥:把id_rsa.pub的文字复制进去大的框,标题:随便(需要登录gitlap)
然后再clone,如果报这个错fatal: Authentication failed for 'http://git.jidiankj.cn/ydk/ydk-manager.git/'
在 git 输入 git config --system --unset credential.helper
再次clone 会弹框输入gitlab账户密码
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
pull远程最新代码到自己分支:
最好先保存当前自己的代码先提交到自己的远程仓库,
回头如果有问题,你还能回滚
然后取拉取dev的
$git pull origin dev
拉远程分支代码 dev为分支名(之前$ git branch -a 查看远程分支 确定是自己分支的代码)
产生冲突:
解决冲突:
可以输入git status 可以告诉我们冲突的文件
在vscode提示,把一些不需要的删掉。
确定没问题之后,
再推到自己的分支,保证自己的代码是最新的,
最好每天在自己分支拉一次dev的代码(自己的最新的代码推到远程库之前再拉,报错还能回退),保证自己分支的代码是最新的。解决冲突之后再push到自己的远程库
如果需要合并的话,切换到dev分支,git merge zhang 把自己的代码合并到dev 然后提交上去 再切回来自己的分支,
更好的解决方法:
查下当前分支,做完功能先把自己的代码push到自己的远程库,然后在自己分支合并dev,没问题后提交到自己的远程库,然后切换到dev拉自己分支(git pull origin dev),没问题再推上去(add commit 四步走)。
创建新的分支,拉取master去改代码,用来发布另一套版本
1、如果在自己本地已经存在主干代码,直接创建切换分支 git checkout -b 分支名字
2、再切换到主干更新代码 git pull origin master
3、再切换到自己新创建的的分支,git pull origin master ,
4、git add .
git commit -m ""
git push --set-upstream origin test(分支名字),第一次push一定要添加 --set-upstream origin test(分支名字),是为了关联该分支,然后添加的内容就是push到test这个分支了。
第二种情况
就是别人创建新的分支,用的这个新的分支去改代码用来发布另一套版本
1、直接创建切换分支 git checkout -b 分支名字
2、然后把别人创建新的分支给拉取到本地以及关联 git fetch origin dev1.1-0604:dev1.1-0604
3、再切换到该分支拉取代码,git pull origin dev1.1-0604
4、切回来拉取 dev1.1-0604代码提交即可
版本回退:
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
(HEAD detached at 4.1.7)分支游离状态
切回 git checkout master
git pull origin
git checkout feature/zsy-copy/1003 4.1.7(在4.1.7基础上创造feature/zsy-copy/1003分支)