关于git
Git 是一个开源的分布式版本控制系统,用于便捷高效地处理任何或小或大的项目。
首先要注意使用git前,需要对系统先进行环境的配置:
-
使用六行配置,保证git能够正常运行
git config --global user.name
git config --global user.email
git config --global push.default simple
git config --global core.quotepath false
git config --global core.editor "code --wait"
git config --global core.autocrlf input
需要注意的是,当使用MacOS操作环境的时候,需要在VScode中将code添加至路径:
-
git与git bash的区别与联系
git只是一系列可以实现版本控制的命令,而bash则是可以运行该种命令的终端。
-
git可以使代码拥有不同版本
git入门(一)
git的基础入门操作为创建本地仓库,并利用本地仓库进行版本的存储、切换、历史版本的查看等操作。
-
git init
运行git init命令可以在当前目录下创建一个名为.git的本地仓库,可以利用该仓库来储存不同版本的代码,但由于该仓库为隐藏文件,可以使用ls -a查看目录下所有文件来查看。
同时,.git为本地仓库,但是在多个版本同时存在时并不会重复记录相同的文件(经过优化)。
-
git add 路径
运行该命令即可确定哪些变动需要提交到本地仓库中,因此每次改动后想要进行提交操作前,都需要git add提交一下。
在多次提交时,可以只运行git add .来对同一文件进行提交。
-
git commit
运行该命令则将改变提交到本地仓库,可以使用后缀来对改变追加描述:
git commit -m 提交并说明理由,但比较局限。具体如下图:
git commit -v 利用VScode对改变进行详细的描述,查看的时候不仅可以看到改变了什么,还能看到具体的理由,并且在修改完后可以方便的在终端看到有哪些修改。具体如下图:
其中,vscode显示为:
在终端显示为:
-
创建.gitignore文件
创建.gitignore文件来确定哪些文件是不需要提交的。(需注意是如果使用VScode打开文件夹可以使创建添加更方便。)具体如下图:
与此同时,系统中有一些已 . 开头的隐藏文件,如node_modules、.DS_Store、.idea、.vscode,若在.gitignore中写入这类文件,则git不会把它们标记为需提交的文件/目录。
-
git log
运行该命令可以查看版本的拷贝,该拷贝为本次改变前的版本,比如若你拥有按顺序的1、2、3三个版本,当跳到版本2时,使用git log将无法看到版本3.具体如下图:
-
git status
可以运行该命令查看哪些文件发生了改动以及其是否被提交。
-
git reflog
通过运行git reflog,可以查看到所有的版本的拷贝,但是局限于本地仓库,相当于‘私人日记’,比如拥有按顺序1、2、3三个版本时,当跳转到版本2后,依然可以通过git reflog查看到版本3,但是git log操作则看不到。
-
git reset --hard 版本
运行该指令则进行版本之间的跳跃,是git操作最重要的指令之一。但是要注意,不能只进行git add操作而不进行git commit操作,否则看不到版本的信息,而不git add直接进行的话代码会丢失。
-
git branch x
git不单止可以拥有不同的版本,也可以创建不同的分支,在不同的分支里面可以同步存在两个不同的版本,而这只需要一个本地仓库就能搞定,通俗来讲x分支就是基于当前树枝长出来的新树枝,可以创造出平行的时间线。
-
git checkout x
运行该指令跳转至x分支,可以在另一条时间线对文件进行修改。
利用git对两条不同时间线进行管理的步骤就是:
- 创造分支git branch x;
- 运行git checkout x移至x分支;
- 修改并git add,git commit 版本名既可以在x分支中修改保存;
- 运行git checkout master可回到主分支;
- 在主分支依然可以修改并进行git add,git commit 版本名来进行版本拷贝;
- 至此就实现了两条分支同时拥有多个版本控制。
但是要注意,git checkout 有可能会出现冲突,此时当前目录中未提交的代码不受影响,这点与git reset --hard不一样,如果出现冲突,那么可以使用git stash来查看有哪些本地修改没有保存。
-
git merge
分支不单止可以被创建,还可以运行git merge来进行合并,具体步骤如下:
- git checkout到达想要保留的冲突;
- 运行git merge 分支名,但是建议先进行git commit直接回车查看哪些冲突需要被解决;
- 出现冲突时,在分支合并操作后会有conflict的提示,可以使用git status -sb来直接在终端查看有哪些冲突需要解决,要做的就是:
- 依次打开每个冲突的文件;
- 然后使用command+F搜索====,在====上下两部分选择需要保留的代码,删掉不用的代码;
- 删除>>>><<<<====;
- git add 对应文件;
- 再次使用git status -sb,解决下一个冲突,当出现M即为已经解决;
- 直到没有冲突时,再运行git commit。
git入门(二)
除了建立本地仓库来进行版本的选择和控制,git还可以与远程端的服务器建立连接,将版本信息直接储存在远端的服务器中,下以其与Github远程端建立远程仓库为例进行详细展示。
首先,要搞清楚Github如何确定是你在操作。
如上图,我通过我的个人账号登陆Github,并且在我的个人电脑上设置私钥,并与Github远程客户端所给的公钥相匹配,匹配成功后我每一次只需要push我要上传的文件,就可以让Github远程仓库帮我存储我的文件。具体的步骤如下:
-
生成SSH key
该步骤主要目的是生成公钥并将其匹配到本地电脑上,并且在Github上也有相应的帮助文档,具体为要运行以下命令:
ssh-keygen -t rsa -b 4096 -C 你的邮箱
cat ~/.ssh/id_rsa.pub 生成公钥
在Github我的账号的setting中找到SSH key并添加title和new SSH key
ssh_T git@github.com 进行调试
运行了这些命令后,就可以在每次上传时使用SSH协议,避免了使用HTTPS协议每次都要填写密码的麻烦。
那么在Github上有账号,git仓库又在本地的电脑上,Github是怎么知道是你在上传文件到你的账号的呢?
答案就是当我们经过上述设置后,电脑上会被放入私钥,而在Github账号上会留下公钥,我们上传的代码文件都是使用私钥加密过的,Github使用公钥就能解密,如果能顺利解开,则配对成功,就可以顺利上传了,从Github上下载代码同理。
-
上传代码
第二步就是直接上传代码了,每次都可以上传本地仓库中的一个分支,也可以说是用来备份.git仓库的。具体如下:
- 新建一个Github的Repositories,复制其SSH地址,直接复制页面中的代码即可;
- 运行git remote add origin git@XXXX,在本地添加远程仓库的地址,其中origin为远程仓库的默认名字;
- 运行git push -u origin master推送本地的master分支到远程的origin仓库的master分支,如果出现提示需要git pull,则git pull就好,该操作只是将远程仓库的分支合并到本地对应的分支,其中-u origin master的意思为设置上游分支,之后再进行git push时则不需要再设置;
- 上传其他分支。git push origin XX:xx,将XX上传到原地的xx分支。
-
下载代码
除了上传代码,还可以从Github远程仓库下载代码。具体操作如下:
1. git clone git@XXXX「目标路径」,如果使用不同的本地机器,则需要重新上传SSH key;
2. 下载某一个分支则需要先下载整个仓库,然后再通过git checkout分支名来进行切换;
3. git clone git@/XXX.git,直接创建一个名为XXX的目录,其中XXX.git为本地仓库(记得操作时要cd XXX);
4. git clone git@?/XXX.git yyy则会创建yyy;
5. git clone git@?/XXX.git .则不会创建新的目录,只会使用当前目录和当前目录下的.git仓库。
-
上传到两个远程仓库
此外,还可以同时上传到两个远程仓库,只需要:
-
同时创建两个git remote add origin (1 2) git@xxxx
-
分别git push origin (1 2)master
-
高级操作
还可以进行一些高级操作,比如使用bash alias来简化命令,使我们使用git的时候效率更高:
touch ~/.bashrc
echo 'alias ga="git add"'>> ~/.bashrc
echo 'alias gc="git commit -v"'>> ~/.bashrc
echo 'alias gl="git pull"'>> ~/.bashrc
echo 'alias gp="git push"'>> ~/.bashrc
echo 'alias gco="git checkout"'>> ~/.bashrc
echo 'alias gst="git status -sb"'>> ~/.bashrc
通过运行这些指令之后,就可以简化指令。
总结
最后做一个总结,git入门基础主要分为本地仓库和远程仓库两大部分:
- 本地仓库
- 首先创建一个新的目录,并用编辑器打开;
- 再利用终端运行git init/git add/git commit操作进行版本控制;
- 利用git log/git reflog查看版本信息;
- 使用git reset --hard 版本名进行版本跳转;
- 同时可以使用git branch创建不同的分支,达到不同时间线操作,并利用git checkout切换不同的分支。
- 远程仓库
- 在GitHub创建远程仓库Repositories;
- 在终端配置origin;
- 在编辑器进行push操作(注意一定要先git add/git commit操作);
- 也可以上传不同的分支或上传到不同的仓库;
- git clone 下载整个远程仓库的内容,可以再在其中切换想要的分支。