git的仓储(repository)分为远程repository和本地repository。多人开发的工程通过远程repository进行协作(如github网页,或者本地服务器搭建的gitlab),个人通过本地的repository进行开发和版本管理。我们先讲解如何下载远程repository到本地,也是初学者学习各种工程最常用的命令;随后,讲解作为开发者如何配置本地的repository以及进行代码管理;最后,讲解如何将本地repository贡献到远程repository。
一、下载网页远端repository到本地
首次下载:
git clone https://192.168.8.66/YLY/test.git
默认将远端repository下载到运行上述命令的路径下。也可以选择将工程下载到指定文件夹名下:
git clone https://192.168.8.66/YLY/test.git test-src
以上命令下载的是master分支,若需要下载某一非master的分支:
git clone https://192.168.8.66/YLY/test.git/ --branch <分支名>
参见:https://www.cnblogs.com/Jing-Wang/p/10991008.html
更新: 如果本地已经存在曾经下载过的工程,需要更新人上传的新版本远端master:
git pull https://192.168.8.66/YLY/test.git
参考:https://www.cnblogs.com/gdwkong/p/8535712.html
若本地修改了代码,会报错:
error: Your local changes to the following files would be overwritten by merge:
Please, commit your changes or stash them before you can merge.
Aborting
解决方案:
git stash #本地工作区的代码暂存到git栈中
git pull #远程工程更新到本地
git stash pop #之前本地修改的代码再更新到工作区
PS: 下载过程中如果出现证书错误,即
Cloning into 'test'... fatal: unable to access 'https://192.168.8.66/YLY/test.git/': server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
解决方案是在terminal中输入:
export GIT_SSL_NO_VERIFY=1
二、本地repsitory管理
1. 概述
需要熟练进行git代码管理需要了解git的一些一本概念
首先,了解git的data model, 包括blob object, tree object和commit object。 详见:https://medium.com/hackernoon/https-medium-com-zspajich-understanding-git-data-model-95eb16cc99f5
随后,理解branch的概念及其对应的ref,以及head的概念,参见:https://medium.com/hackernoon/understanding-git-branching-2662f5882f9
最后,掌握git的三个区域:working directory, staging area, and the repository,以及git操作git add, git commit对应的对三个区域的修改,可参考:https://medium.com/hackernoon/understanding-git-index-4821a0765cf
2. 首次配置本地git
全局配置:
git config --global user.name "YLY"
git config --global user.email "[email protected]"
生成本地repository:
cd your_folder_to_upload
git init //本地仓储初始化,在文件夹中生成了 “.git”隐藏文件,用于接下来存储git的信息。其中,.git/object/里面包含了blob object, tree object, commit object;.git/refs/包含branch的信息;./git/index存储working directory, staging area, and the repository的文件版本信息
将working directory文件同步到staging area:
git add . //同步working directory的文件到staging area, “.”表示添加文件夹下的所有文件
staging area文件同步到本地repository:
git commit -m "Initial commit" // 文件存储到版本库区 (Commit History)
3. 如果修改了working directory的文件,需要同步到本地repository
可先查看working directory文件夹相对于本地repository发生的修改:
git status
随后再分别执行
git add your_changed_file //向本地repository中添加文件, “.”表示添加文件夹下的所有文件,如果只想添加特定文件夹或文件, 直接写 git add your_file_name
git commit -m "Changed files" // 将更改同步到本地repository (commit表示修改),此步骤不可忽略,因为远端repository是从本地repository进行同步的,所以必须先把修改同步到repository;如果修改没有同步到本地repository,直接push到远端,则会显示“Everything up-to-date”
4. 查看历史版本代码
使用git log查看commit的版本号,例如:
commit 5624dfsfsdfdsfsdfljsdpfpsdfsdlfjosdfi9c
Author: yly <[email protected]>
Date: Thu Jan 21 15:05:35 2021 +0800
随后使用:
git checkout <SHA1> //HEAD切换到具体的一个commit,但会导致git status时提醒HEAD detached at <SHA1>, 如果需要回到可被追踪的分支可以选择git checkout <branchname>
git checkout 5624dfsfsdfdsfsdfljsdpfpsdfsdlfjosdfi9c
将本地代码回退到历史状态。
若出现checkout后文件无法全部显示(出现很多D files的提示),可运行:
git reset --hard
若想回到最新的版本,只需要运行
git checkout master
建议的更安全的操作是创建一个分支,处理后再删除临时分支:
git checkout -b tmp_branch 5624dfsfsdfdsfsdfljsdpfpsdfsdlfjosdfi9c //进行历史版本查看或修改
git checkout master
git branch -d tmp_branch
5. 版本回退
git reset --soft HEAD~1 //repository变为HEAD指向的commit,但是working directory和staging area保持不变,这里HEAD~1表示撤销上一次commit
git reset --mixed HEAD~1 //repository变为HEAD指向的commit,staging area也同步更新,但是working directory的内容保持原来不变
git reset --hard HEAD~1 //repository,staging area和working directory都变为HEAD指向的内容。
git版本回退教程参见:https://blog.csdn.net/yxlshk/article/details/79944535
reset更详细的介绍可参见:https://medium.com/hackernoon/reset-101-ba05d9e3f2c7
这种方法会造成历史版本的永久丢失,更推荐的方法是通过revert版本反做实现回退,即在后面添加过去的版本的新的commit:
git revert HEAD~1
6. 分支管理
程序更新后,可以上传到同一个工程的新分支,进行版本管理:
git branch //查看所有分支和当前所在分支
git branch <branchname> //创建分支
git checkout <branchname> //切换分支
git checkout -b <branchname> //创建+切换分支 For example, git checkout -b v2.0
git add .
git commit -m "New vision"
版本的分支可以有很多,但master只能有一个,一般是最新版本。可以把分支变成master,即点击merge request请求,随后master的管理员可以选择同意Merge,则该分支晋升为master。
merge的详细资料: https://medium.com/we-are-madewithlove/pointers-and-tips-dispelling-the-magic-of-git-merge-4c8bb3e227ac
三、远端git
1. 本地文件上传到github/gitlab上(远端网络repository):
具体命令如下:
git remote add origin https://192.168.8.66/YLY/test.git //添加远端网络repository
git push -u origin master //将本地repository的更改同步到远端网络repository
git push origin <branchname> //For example, git push origin v2.0
PS:认证错误的解决
执行命令
git push -u origin master
时可能出现
remote: HTTP Basic: Access denied
fatal: Authentication failed for 'https://192.168.8.66/YLY/test.git/'
解决方案:
在terminal中输入
export GIT_SSL_NO_VERIFY=1
该命令仅在当前的terminal有效。
另一种可能的证书错误bug:
fatal: unable to access 'https://192.168.8.66/YLY/test.git/': server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
解决方案:
git config --global http.sslverify "false"
进行操作,完成后再回置设置:
git config --global http.sslverify "true"
2.重新配置
2.1 删除本地repository:使用terminal删除文件夹下的 .git文件夹(隐藏文件夹)。
2.2 删除远端repository: 网页中setting->general->advanced->remove project。
2.3 添加新的远端地址或修改远端地址
例如,修改本地工程对应的远端,即上传到另一个远端repository上,直接添加新的远端地址会出现错误:
git remote add origin https://192.168.8.66/YLY/test_updated.git
显示:
fatal: remote origin already exists.
解决方案:
git remote rm origin
随后再添加新的远端地址:
git remote add origin https://192.168.8.66/YLY/test_updated.git
bisect: https://konrad126.medium.com/keep-calm-and-git-bisect-1610c6bced29