Git 教程
本教程将从零开始教会大家如何使用git,主要包含以下内容:
文章目录
git官方参考资料:
教程:https://git-scm.com/book/en/v2
查找命令:https://git-scm.com/docs
0. 准备工作:下载安装git
在windows系统上使用git
安装windows版本git:https://gitforwindows.org/
在Linux系统上使用git
安装linux版本git:https://git-scm.com/downloads/linux
网站内有不同linux系统下git的安装命令
如果使用的是公共开发服务器(如学校或者公司服务器)通常git是已经装好的,可以跳过这一步
通过命令行终端使用git!
git的的所有操作均在终端内进行,强烈建议不使用GUI界面,包括git GUI,github desktop等
windows系统下打开git bash出现命令行终端;linux系统下直接使用自带命令行终端即可
1. 创建/克隆一个git仓库
创建仓库
在某一文件夹(建议为空文件夹,不要是已有git仓库的文件夹)下执行:
git init
可以看到文件夹中出现.git文件。.git是隐藏文件,如果看不到请检查自己的设置。不要随意删除.git文件!
这个时候,我们就已经创建好了一个空仓库,后面我们会往仓库添加文件,并设置与远程仓库的关联
克隆仓库
克隆时会自动创建一个和项目名称相似的文件夹并将代码放进去,因此不必单独为其创建文件夹
克隆时一般有ssh和https两种方法,如克隆本项目时有两个网址可以选择:
clone with ssh: git@gitlab.com:Siyuan011/Git-Instruction.git
clone with https: https://gitlab.com/Siyuan011/Git-Instruction.git
如使用ssh,可能需要在远程(本教程中远程指github和gitlab这种代码管理网站)添加ssh key,具体操作方法各有不同。ssh更多用于公司等对安全需求较高的场景,图方便的话可以用https
于是我们图方便通过https克隆,注意如果代码管理网站在境外的话(如github)需要梯子。本项目在gitlab所以不用梯子。命令行执行以下命令:
git clone https://gitlab.com/Siyuan011/Git-Instruction.git
可以在本地看到Git-Instruction文件夹。进入文件夹可以看到本项目下的所有文件
动动手!
你可以在github或gitlab创建一个仓库,创建时根据提示走,记得选择在仓库中添加README。然后将代码clone到本地试试看
2. 添加/删除/修改仓库中的文件,并上传到仓库
###开始使用git管理代码吧!
以下讲述git管理代码的最简单流程:
自由添加/删除文件,修改文件中的内容,完成你需要的功能。修改完成后,通过以下命令查看当前的修改:
git status
可以看到有如下三种文件状态:
# 文件被修改,但改动未添加到暂存区
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: README.md
# 文件已经添加到暂存区,准备好被提交(commit)
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: README.md
# 文件未被追踪,通常是新添加的文件或设置不追踪的文件
Untracked files:
(use "git add <file>..." to include in what will be committed)
src/
这里需要讲一下工作区,暂存区,本地仓库和远程仓库
工作区就是指你能看到的目录。你在工作(敲代码)的地方就是工作区
暂存区可以理解为工作区和仓库之间的缓冲区,只有在暂存区的代码才可能被提交到仓库,因此只将需要提交的代码加到暂存区。
本地仓库即本地存放代码的地方,你的每一次提交都被记录在本地仓库中,随时可以取出
远程仓库是远程存放代码的地方,如github,gitlab
更多细节可以参考https://www.runoob.com/git/git-workspace-index-repo.html
一般来说,修改代码的流程如下:
先将文件或文件夹添加到暂存区:
git add directory/ # 添加文件夹
git add file # 添加文件
再将文件提交到本地仓库:
git commit -m commit-message # -m 指commit信息,必填,建议填当前日期和commit内容
通过上述代码我们创建了一个新的提交,也成为一个commit。通过git log命令可以看到commit日志
先别急着上传到远程,在团队协作时很有可能出现你和队友同时修改了同一个文件里同一段代码的情况,这被称为冲突(conflict)。git无法自动合并代码冲突的情况,因此建议先pull一下远程代码并处理冲突。如果直接push,出现冲突会被reject,相当于无事发生
git pull origin master # origin指远程仓库名,master指远程分支名,并不一定填origin和master!
假如真出现了冲突,在需要处理冲突的文件中手动合并代码,然后通过git add添加到暂存区,通过git commit提交到仓库,和前面的流程一样
之后就可以将本地仓库的文件push到远程:
git push origin master # origin指远程仓库名,master指远程分支名,并不一定填origin和master!
如果之前关联过本地分支和远程分支,可以直接使用git push,不必加仓库名和分支名
什么是分支?
以下讲述什么是分支,分支有什么作用,本地分支和远程分支
一个项目通常只有一个主分支,一般叫做master或者main。为了保证主分支是干净的,通常不直接在主分支上开发,而是在本地创建一个新的分支,在新分支上开发完成后再合并到主分支,类似如下流程图:
/—— develop —— \
/ \
——master——/ —————————— \——master——
首先查看分支:
git branch #查看本地分支
git branch -r #查看远程分支
git branch -a #查看本地和远程分支,同时也可以查看到本地和远程分支的对应关系
接下来我们来创建一个新的分支。创建分支前,需要保证现有工作区的修改都已经保存。通过git add 和git commit的方式直接提交到仓库是一种可行的做法,也可以使用如下命令:
git stash # 将现有修改存储到当前branch的暂存区(不提交到仓库)
git stash pop # 取出当前branch中暂存区中最后的修改,并删除这条数据
保存修改之后,从当前分支创建新本地分支:
git checkout -b develop
通过以上命令,我们创建了一个叫做develop的分支,新分支内容和当前分支完全一样
有的时候我们需要帮队友debug,这时可以让队友将代码传到远程仓库的某个分支上,然后我们从远程分支创建新本地分支进行调试:
git fetch origin #抓取origin仓库的所有远程修改,但先不应用到本地
git checkout -b develop origin:remote_branch
通过以上命令,我们创建了new_branch分支,分支内容和origin仓库的remote_branch分支完全一样
无论哪种方式,我们创建了develop分支,在奋战一番后完成了功能的开发,并提交了commit。现在我们需要将develop分支合并到主分支:
git checkout main #先切换到主分支
git merge develop #合并develop分支到主分支
merge过程中同样可能需要手动处理冲突
那么什么是远程分支?远程分支就是在远程代码仓中的分支,这些分支可能存储项目的不同版本或debug版本。将本地分支push到远程分支同样非常简单:
git checkout -b version2
git push origin version2 # 将本地分支version2推到远程分支version2
git push -u origin version2 # 将version2推到远程,并关联本地分支和远程分支
最后一个命令中,-u是--set-upstream的缩写。如果在push的时候没有设置关联,也可以通过以下命令手动设置关联:
git branch --set-upstream-to=origin/version2
注意这里是--set-upstream-to
上手试试?
目前你已经学会了git管理代码的所有基础操作,你可以在第一节中创建的git项目中添加一些代码,跑一下上述流程试试看。你可以从main分支分别创建两个开发用分支,并在两个分支上对同一段代码进行修改。这样当你合并分支时就会遇到冲突,从而可以熟悉如何手动合并代码/解决冲突
3. git团队合作技巧与代码仓管理
上传哪些代码到仓库?
在实际的项目开发中往往多人共用同一个git仓库,因此哪些文件上传到git仓库就十分重要。原则上来说公用的文件(源代码,自动格式化工具的配置文件等)需要上传,个人文件(.vscode文件夹下的文件,代码编译出的可执行程序,程序运行的结果文件等)不上传。尽量不要上传非代码文件(编译好的可执行程序,项目工程文件等)
在github中,可以添加**.gitignore**文件来忽略一些文件和文件夹,这些文件和文件夹不会被git追踪。例如,在.gitignore文件中添加以下几行行代码:
build/
.vscode/
debug.txt
git会忽略build文件夹,.vscode文件夹和debug.txt这一文本文件。即使在项目根目录使用 git add . 来添加所有修改到暂存区,上述文件和文件夹也不会被添加。不过,强烈建议在 git add 之前使用git status查看现有修改并选择其中需要上传的部分添加,而不是使用 git add . 这种简单粗暴的方法。
使用merge request进行团队合作
以下讲述MR以及如何用MR进行团队协作开发
首先fork项目主仓库
现在假设项目主仓名叫project,其由管理员admin创建。作为项目成员,我们需要在gitlab中点击fork按钮复制这一仓库到自己的仓库,此时自己的仓库名字也自动被设为project。于是,我们有了admin/project这一主仓和yourname/project这一子仓。
克隆子仓库,设置主仓为上游仓库,在子仓上开发
克隆子仓库:
git clone https://gitlab.com/yourname/Git-Instruction.git
设置主仓库为上游仓库:
git remote add upstream https://gitlab.com/Siyuan011/Git-Instruction.git
注意,这里upstream实际上可以设置为任何除了origin之外的关键字,但出于惯例我们设为 upstream。完成上述设置之后,就可以在子仓库上进行开发了。这里建议直接在子仓库的main分支进行开发,因为主仓本身就是clean的,不必在子仓在单独保留一条干净的分支。
开发完成,将代码合入主仓
你的代码开发完成时,很可能主仓已经被你的队友更新过了,因此建议先pull主仓的代码:
git pull upstream main # "upstream"与你在前面给主仓设置的名字一致
pull下来可能需要解决冲突,这个过程中注意和队友确认代码含义。解好冲突后,我们提交commit,并将代码push到自己的子仓:
git push origin main
为什么不直接push到主仓?首先你没权限,其次你的代码需要大家review之后仓能合入
这里我们需要在子仓的gitlab界面提交merge request (MR,在github中叫PR,是一个东西)。MR是指将代码从主仓库/复制仓库的某一分支合并到另一分支的请求,发起MR时需要指定源分支和目标分支,如:
yourname/master --> Siyuan011/main
在gitlab界面上点点点就可以创建MR,成功创建MR之后能看到提交的代码和主仓代码的对比,方便队友review。如果提交MR之后显示代码冲突无法合入,你需要pull主仓代码合并后再上传。
创建MR时注意以下几点:MR的名字需要概括这个MR的主要内容;在MR描述部分需要写清楚这个MR做了什么修改;在提交MR时尽量选择squash commit,即将MR内的所有commit压成一个commit提交,避免污染主仓的commit log。
*也有一些开发者喜欢在主仓上新建分支进行开发,将其push到远程主仓后并通过MR将其与主分支合并,即Siyuan011/develop --> Siyuan011/main。这也是一种好的协作方法,有兴趣的同学可以尝试
代码回退
上述流程完全够用的前提条件是你的每一步操作都完全正确。可假如你有一些误操作,比如上传了本不想上传的代码,没有正确解决冲突,或者一波神奇操作把代码完全搞乱掉了,别担心,git能帮你解决绝大多数回退问题
git add 操作回退
如果你不小心将不想上传的代码传到了暂存区,可以使用如下命令进行回退:
git reset HEAD file.txt # 将文件移出暂存区
git reset HEAD dir/ # 将文件夹移出暂存区
git reset HEAD # 将所有暂存区中的文件和文件夹全部移出
以上三种方法会保留你对文件内容的修改,但将文件移出暂存区
可以使用git status命令查看你对暂存区的修改是否符合预期
git commit操作回退
如果你错误的提交了commit。可以使用以下命令进行回退:
git reset --soft HEAD^
这样可以撤回commit操作,但你工作区的内容(对文件内容的修改)仍然保留
代码回退
如果你想会退到之前某个版本的代码,可以使用以下命令:
git reset --hard 版本号 # 版本号为commit的哈希值(SHA),在gitlab点进某个commit之后可以看到copy commit SHA的按钮
这样可以将仓库和工作区全部回退到指定的版本,注意未保存的修改将丢失。因此强烈建议在回退前新建一个branch并push到远程作为备份

1万+

被折叠的 条评论
为什么被折叠?



