1.git基础
首先在当前目录下使用
git init
初始化当前仓库
git clone 目标git仓库的ssh地址
将远程仓库所有文件克隆到本地
git log
/*commit 21e227b2a8e7049322c72030e1da307cea542c7e (HEAD -> main, origin/main, origin/HEAD)
Author: halfmelon <113506319+halfrmon@users.noreply.github.com>
Date: Wed Sep 11 08:57:50 2024 +0800
Initial commit*/
使用gitlog ,查看到当前的Head指针是指向main分支的
向当前工作区添加一个Main.cpp文件,使用
git status
可以查看当前状态为
位于分支 main
您的分支与上游分支 'origin/main' 一致。
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
main.cpp
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
也就是目前main.cpp文件已经在工作区了,但是还没有进行跟踪,按照提示进行操作
git add .
这是将工作区所有的文件都提交到暂存区,也可以使用
git add 目标文件
来提交单个文件到暂存区,这样目前的git状态就变更为
位于分支 main
您的分支与上游分支 'origin/main' 一致。
要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
新文件: main.cpp
使用
git commit -m "第一次提交"
将暂存区的文件提交到本地分支中,这里-m是message的意思,为本次提交添加描述
此时,git的状态变更为
位于分支 main
您的分支领先 'origin/main' 共 1 个提交。
(使用 "git push" 来发布您的本地提交)
无文件要提交,干净的工作区
本地分支要领先远程分支一个提交
但目前仍不能直接git push将代码之间上传,在实际的开发工作中,由于是多人合作开发,因此在上传自己的分支或代码前,还需要使用
git pull
来更新最新的代码,然后才可以使用
git push origin main
将本地分支的文件提交到远程main分支中
这个时候使用git log查看,得到
commit b858702356fcec8ae1baa0bdd28e973f52433d56 (HEAD -> main, origin/main, origin/HEAD)
Author: chenzhichao-learn <11976304+chenzhichao-learn@user.noreply.gitee.com>
Date: Wed Sep 11 09:20:48 2024 +0800
第一次提交
说明目前已经正常提交,将代码从工作区提交到暂存区,然后从暂存区提交到本地分支,最后上传到远程仓库分支中
2.git各阶段代码回退操作
在实际工作中,可能会存在需要更新或者抛弃旧版本代码的场景,这个时候就需要将代码文件进行回退,在不同的阶段回退的操作不一样
2.1工作区代码回退
对工作区代码进行回退比较简单,可以直接修改代码,也可以使用git checkout --文件名的方式来放弃修改
模拟对main.cpp进行修改的场景
chen@czc:~/AV_Development/Git_test/Git_test$ git status
位于分支 main
您的分支与上游分支 'origin/main' 一致。
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git restore <文件>..." 丢弃工作区的改动)
修改: main.cpp
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
这个时候我们想丢弃main.cpp的修改,使用
git checkout -- main.cpp
此时使用git log,发现目前状态变更为
位于分支 main
您的分支与上游分支 'origin/main' 一致。
无文件要提交,干净的工作区
2.2暂存区代码回退
当使用git add . 将文件提交到暂存区后,可以使用
git reset HEAD <file>
来取消文件的提交,这里的file是具体的文件名
2.3本地分支代码回退
当使用git commit将文件提交到本地分支后,使用git log查看日志发现
ommit b858702356fcec8ae1baa0bdd28e973f52433d56 (HEAD -> main, origin/main, origin/HEAD)
Author: chenzhichao-learn <11976304+chenzhichao-learn@user.noreply.gitee.com>
Date: Wed Sep 11 09:20:48 2024 +0800
第一次提交
这里已经提交了,可以使用
git reset --hard 21e227b2a8e7049322c72030e1da307cea542c7e
来将本地分支的代码版本回退,21e227b2a8e7049322c72030e1da307cea542c7e这一段数字可以理解为唯一版本号,或是指针。将版本回退到这个数字所代表的版本,也就是将HEAD指针指向这个版本。
这个时候我们再采用git log查看,会发现日志变更为
commit 21e227b2a8e7049322c72030e1da307cea542c7e (HEAD -> main)
Author: halfmelon <113506319+halfrmon@users.noreply.github.com>
Date: Wed Sep 11 08:57:50 2024 +0800
Initial commit
还可以通过 git reflog 来查看HEAD变更的记录
git reflog
21e227b (HEAD -> main) HEAD@{0}: reset: moving to 21e227b2a8e7049322c72030e1da307cea542c7e
b858702 (origin/main, origin/HEAD) HEAD@{1}: commit: 第一次提交
21e227b (HEAD -> main) HEAD@{2}: clone: from github.com:halfrmon/Git_test.git
2.4远程仓库分支代码回退
当将代码上传到了远程仓库后,这个时候不能随意进行回退,然后再上传。团队协作的环境下,可能目前其他人将他们的代码进行了上传,这个时候如果直接将代码版本回退,然后重新上传可能会导致覆盖了别人的代码(不想挨骂就少干点)
这里可以给出两个方案,一个是使用git pull将最新的代码拉取下来,然后在上面改。第二个可以确认没有人上传的时候,将代码回退,然后git push -f强制上传
3.git推送代码出现冲突
在团队协作下的情况下,假设目前有版本1,A、B两人都在这个版本基础上进行开发,A将代码版本2推送到远程仓库,此时没有问题,远程仓库版本变更为2,此时B就没有办法将他的版本3上传至远程仓库
这个时候可以使用git pull将文件进行更新,git会自动合并,如果无法进行自动合并,就需要手动进行合并操作。
4.git创建本地分支
如果不想影响本地的main分支,可以创建其他的分支
使用
git branch -r //查看远程仓库分支
git branch -a //查看本地和远程仓库的分支
* main
remotes/origin/HEAD -> origin/main
remotes/origin/main
使用git branch -vv可以查看当前分支跟踪的远程分支
chen@czc:~/AV_Development/Git_test/Git_test$ git branch -vv
* main 3a57ae2 [origin/main] 修改代码
创建新分支、并切换到新分支
git checkout -b 新分支名
切换到一个新分支 '新分支名'
此时git log状态变更为
commit 3a57ae22ac4a481625a7b0209d39a8a964a2f38d (HEAD -> sortdev, origin/main, origin/HEAD, main)
Author: chenzhichao-learn <11976304+chenzhichao-learn@user.noreply.gitee.com>
Date: Wed Sep 11 16:43:36 2024 +0800
但是目前只是创建了一个新分支,并没有将这个分支跟踪任何远程分支,因此目前不能进行git pull,也无法将代码推送到远程仓库
此时将分支切换到main,并可以将新分支和主分支合并
git checkout main
切换到分支 'main'
git merge sortdev
更新 3a57ae2..0e66ed4
Fast-forward
main.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
其实这个操作就相当于直接在main分支上进行修改代码
也可使用
git push origin sortdev:main
将sortdev的代码推送到远程origin仓库的main分支中
使用
git branch -d 新分支名
删除这个分支,一定要注意,如果新分支没有和main分支进行合并,是无法删除的
5.解决本地分支合并冲突
上一节合并的时候,本地的main分支没有任何改变,因此可以很容易的就将新分支和本地分支合并,但很有可能接出现这种情况:在本地创建了一个新的分支,但是随后又切换到main分支并git
pull了,此时main分支和新分支就出现很多不同,假设此时main分支中的改动和新分支的改动是同一个文件,此时就不能进行直接合并,会出现conflict提示,此时需要手动的去进行合并操作
6.git远程分支管理
在实际的开发工作中,完成了项目的基本功能后,一般会在远程拉一个新的分支,后期的功能添加、bug修改等工作都在新分支中进行,而不会一直在main分支中进行开发,而远程新分支的创建一般是由管理员进行创建的,其他人员没有创建的权限。
现在创建了一个dev_1.1的分支,使用git pull将代码拉取
* [新分支] dev_1.1 -> origin/dev_1.1
已经是最新的。
chen@czc:~/AV_Development/Git_test/Git_test$ git branch -r
origin/HEAD -> origin/main
origin/dev_1.1
origin/main
发现出现了一个新的分支
此时我们使用git checkout -b dev_1.1创建一个同样名字的本地分支,并让其跟踪远程的dev_1.1分支
chen@czc:~/AV_Development/Git_test/Git_test$ git checkout -b dev_1.1 origin/dev_1.1
分支 'dev_1.1' 设置为跟踪来自 'origin' 的远程分支 'dev_1.1'。
切换到一个新分支 'dev_1.1'
此时可以使用git branch -vv查看跟踪情况,发现已经跟踪到了
chen@czc:~/AV_Development/Git_test/Git_test$ git branch -vv
* dev_1.1 0e66ed4 [origin/dev_1.1] 新分支提交
main 0e66ed4 [origin/main] 新分支提交
如果本地分支名与远程分支名不一致,此时推送远程分支代码需要变更为
git push origin 本地分支名:dev_1.1
总结
目前仅仅更新了git的基础,包含了各项的基本操作,但是跟实际的开发环境还是有点出入,后面几天将实际的工作git流总结一下吧,这也是我发的第一篇博客,勿喷