Git笔记
(针对于Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com)的小总结)
简介
git是一个分布式的版本控制工具,最早是由linux之父所开发出来的。类似于这种版本控制工具还有很多,向svn等等,但是svn这些都是
集中式的版本控制工具,而且这种都需要联网才能够上传文件,而且存在很多的一些弊端。现在Git的使用频率会高一些。
ps:版本控制其实就是一个对文件每次修改后进行来进行保存,同时也记录了每次修改的内容
在Git中是支持linux命令的。
相关的配置:
git config --global user.name "yourname"
git config --global user.email "youremail"
这个其实是配置自己仓库的一些参数,用来识别仓库时来进行使用的。每个仓库也可以指定不同的用户和邮箱地址
Git相关操作
-
-
初始化,建立一个本地的仓库repository,这个可以理解为是一个目录,对于windows下可能存在一些问题推荐使用英文的目录,尽量少使用中文,这样可以避免一些莫名奇妙的错误 git init
这样就可以在一个目录下建立一个respository了,这个目录下面就会出现一个.git 的文件,通常这个文件是隐藏的 -
然后就是将文件推送到仓库,首先先创建一个文件,这个一个文件需要存在repository下,然后使用git add filename.xxx 将文件添加到repository中 git add file_name
-
最后使用commit提交到repository中 git commit -m "文件的说明"
引号中是文件的说明,一般包括你对项目中代码进行了哪些修改
-
- 使用
git status 可以看见在你的repository中那个文件被修改了, - 然后可以使用
git diff file_name 来查看文件的改动
总之通过这两个命令可以很好的去掌握repository中文件的变化
-
- 在git中每一次commit都会保存一个快照,这样就可以将被修改的文件随时进行rollback的操作了。这个其实也就是通过Git中的
head 指针来进行操作的。当其指向哪个version就是哪个version - 在git中可以使用
git log 来查看所有的version信息,也可以在后面加上--pretty=oneline 的参数。每个记录前面的一长串信息就是commit id。另外HEAD 是当前的版本,HEAD^ 是前一个版本,一般来说存在几个^ 就是前几个版本,但是这样会很麻烦,可以通过HEAD~X ,这里x为一个参数,表示回退的版本 - 可以使用
git reset --hard ,来实现相关的回退,hard后面可以接commit id和HEAD^等等一些信息来进行操作 - 当回退后想回到先前的version,使用commit id对应的
git reset --hard commit_id 即可 - 查看命令记录,可以使用
git reflog 来进行查看
-
在git中存在一些概念:工作区(working directory)这个就是你的文件目录,也就是你在Windows下面所看到的目录;仓库(repository)这个其实就是那个隐藏文件.git 文件,这个里面最重要的就是暂存区(stage);还包括HEAD指针,以及分支master
过程:首先先通过git add是将工作区的文件提交到stage中去,然后通过commit是将stage的文件提交到master中
-
在git中保存的是文件的修改,而不是整个文件。
git diff HEAD -- xxxx.xxx
通过这样就可以将master中最新的文件和工作区中的文件进行对比
-
在git中进行文件的回退,当你的文件出现了错误时,那么就可以通过git checkout -- file_name ,不能够忘记**-- file_name**,否则就会变成更改branch的相关命令了
checkout命令:
- 当文件提交到stage中去了,但是又在working directory中修改了,那么checkout命令那么就会直接将工作区中的文件回退为stage中那个文件
- 当文件没有提交到stage中,working directory的文件修改了,那么checkout命令就会将working directory的文件替换为master中的最新的文件
还有就是将文件以及提交到来暂存区中,可以使用git reset HEAD file_name ,这样就可以将stage中文件清空,将其放入到working directory中去,使working directory发生改动。然后使用checkout命令进行清空。
对于version回退的前提是:没有将repository推送到远程仓库中去。
-
对应git的文件删除:
- 可以在资源管理器中进行删除,然后使用
git rm file_name 来进行操作,最后再commit一下这样就可以从repository中删除了。 - 当然,如果是误删,就可以使用checkout命令来实现回滚,类似于文件的修改。
远程仓库
-
首先在自己的电脑上创建一个ssh密钥: ssh-keygen -t rsa -C "youremail"
这样就可以在C盘下的.ssh目录中创建id_rsa和id_rsa_pub,一个是私钥,一个是公钥。 -
然后利用公钥到GitHub上生成ssh key -
然后再GitHub中创建一个空的仓库,然后执行下面命令: git remote add origin GitHub中仓库的ssh地址
这里的origin是远程仓库的名字,可以任取,一般看见origin就知道是远程repository了 然后使用: git push -u origin main
这里的main是一个分支;第一次连接需要使用**-u**这个参数,这样就可以使远程仓库和本地的关联起来了,从而也可以实现命令的减化,以后就可以直接使用git push origin main -
删除关联:先可以查看关联git remote -v ,然后按照远程仓库的名字进行删除git remote rm xxxxx -
克隆项目:git clone xxxxx ,(这种似乎就直接关联了,不确定)
分支
-
分支branch这个就相当于平行宇宙这个东西一样,两个branch之间是不会有影响的。 -
Git是按照时间线来存储的,一般来说就是master一直向前走,然后通过HEAD来进行指定。当建立了一个新的分支后,就相当于新建立了一个主线,类似于master之类的。当使用new branch时,那么HEAD就会开始来指向new branch。而master就不会发生改变,一直会停在那里。当进行合并时,其实也就是将master之间拉到new branch那个地方,然后开始使用HEAD来进行指定 -
创建branch:git branch branch_name -
切换branch:git checkout branch_name /git switch branch_name -
创建&切换:git checkout -b branch_name -
合并:git merge branch_name ,这里是将branch_name这个分支添加到当前的这个分支上 -
删除:git branch -d branch_name -
有时我们需要进行手动的去解决merge时出现的冲突 -
一般来时进行分支合并的时候,会使用“快速合并”,但是这种的话,当分支删除后,会丢失分支信息。一般采用禁用到这种合并,但是这种一般会再commit一次。 git merge --no-ff -m "说明" branch_name
-
一般很少使用master这种主分支,而是使用其他的分支,而再不断的将其合并到主分支。这样可以解决很多的问题 -
当出现了一个bug时,你不想提交当前的工作时,你可以使用git stash 从而将其临时的存储起来。这样就可以新建一个临时的分支来进行修复了。然后再git stash pop 进行恢复,同时进行删除缓存的信息。也可以通过git stash list 来查看缓存的信息。这个其实就是一个“栈”的结构。如何同时存在多个分支,那么其他的分支也存在bug,当然也可以通过先前的方式来进行解决;其实也可以通过cherry-pick这个命令来复制一个特定的commit到指定的分支上
git cherry-pick commit_id
这个commit_id是之前修复时的那个commit_id
-
对于一些没有merge的分支进行删除时,那么是无法进行删除的,需要使用**-D这个参数,使用-d**是无法删除的、 -
当项目进行提交时,可能因为远程仓库项目快一些,无法使用push,你需要将项目pull下来进行整合,但是有时候不是主分支,可能没有先关联,需要先关联,git branch --set-upstream-to=origin/branch_name branch_name ,然后就可以正常的pull下来了,但是需要merge才能够进行提交,按照以前的方法解决即可。最后再push即可
-
从repository中clone项目时,是没有分支的。需要自己创建,再与远程的分支进行关联。git checkout -b branch_name origin/branch_name -
使用rebase可以是图更加直观
tag标签
-
通过标签可以很直观的,回退version,不用记住那些commit id。 方法:git tag tag_name 这个是之间将标签打在最新的commit上,也可以在后面指定commit id来指定这一时期的tag;也可以使用-a,-m来指定对应tag_name和说明 -
提交到远程:git push origin --tags -
删除远程的标签:先删除本地git tag -d tag_name ,然后再使用git push origin :refs/tags/tag_name
|