1.学习目标
2.Git概述
Git 是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。
Git 易于学习,占地面积小,性能极快。 它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。 其性能优于 Subversion、 CVS、 Perforce 和 ClearCase 等版本控制工具。
Git官网:Git (git-)
1.版本控制
版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。
版本控制其实最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换。
1.为什么需要版本控制?
从个人开发过度到团队协作
2.版本控制工具
集中式版本控制工具
集中化的版本控制系统诸如 CVS、 SVN 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。
这种做法带来了许多好处,每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个集中化的版本控制系统, 要远比在各个客户端上维护本地数据库来得轻松容易。
事分两面,有好有坏。这么做显而易见的缺点是中央服务器的单点故障。如果服务器宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。
分布式版本控制工具
Git、 Mercurial、 Bazaar、 Darcs……
像 Git 这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整地镜像下来(本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一 次文件提取操作,实际上都是一次对整个文件仓库的完整备份。
分布式的版本控制系统出现之后,解决了集中式版本控制系统的缺陷:
1.服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的)
2.每个客户端保存的也都是整个完整的项目(包含历史记录, 更加安全)
2.工作机制和代码托管中心
工作机制
代码托管中心
局域网
GitLab
互联网GitHub(外网)Gitee 码云(国内网站)
3.Git安装
在官网下载git的安装包
选择安装目录,next
选择默认编辑器
总结:一路next
查看版本:安装成功
4.Git常用命令
说明:签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git 首次安装必须设置一下用户签名,否则无法提交代码。
注意: 这里设置用户签名和将来登录 GitHub(或其他代码托管中心)的账号没有任何关系。
01.设置用户签名
打开Git Bash
验证:在当前用户目录下找到,打开
无误,则用户签名设置完成
02.初始化本地库:git init
案例:新建一个文件夹,当前目录进入Bash命令界面
创建了一个名为.git非空隐藏文件夹
03.查看本地库状态:git status
新增hello.txt
查看工作区有hello.txt,但是没有提交到暂存区
04.添加暂存区:git add 文件名
此时hello.txt已经提交在暂存区,git可以追踪到
05.提交本地库:git commit -m “日志信息” 文件名
再次查看
查看日志:
git log与git reflog区别
git log 命令可以显示所有提交过的版本信息,如果感觉太繁琐,可以加上参数 --pretty=oneline,只会显示版本号和提交时的备注信息。
git reflog 可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)。例如,执行 git reset --hard HEAD~1,退回到上一个版本,用git log则是看不出来被删除的commitid,用git reflog则可以看到被删除的commitid,我们就可以买后悔药,恢复到被删除的那个版本
06.修改文件
修改hello.txt内容,git status
会提示该文件修改过
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)//修改文件信息$ vim hello.txt erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ git statusOn branch masterChanges 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: hello.txtno changes added to commit (use "git add" and/or "git commit -a")erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)//添加到缓存区$ git add hello.txtwarning: LF will be replaced by CRLF in hello.txt.The file will have its original line endings in your working directoryerhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ git statusOn branch masterChanges to be committed:(use "git restore --staged <file>..." to unstage)modified: hello.txterhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)//第二次提交$ git commit -m "second commit" hello.txtwarning: LF will be replaced by CRLF in hello.txt.The file will have its original line endings in your working directory[master 1eb2fb2] second commit1 file changed, 1 insertion(+), 1 deletion(-)erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ git logcommit 1eb2fb245fbf8d5a28d35fb1072b80befb67e4c2 (HEAD -> master)Author: syb <903923381@>Date: Fri Mar 18 11:22:18 +0800second commitcommit 4c9e1f045b47f30f3e84c0a19ee4ac641762db9dAuthor: syb <903923381@>Date: Fri Mar 18 11:11:30 +0800first commit
07.版本穿梭:git reset --hard 版本号
git reset --hard 版本号# 首先查看当前的历史记录abc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)$ git reflog41f776b (HEAD -> master) HEAD@{0}: commit: third commit6967bf0 HEAD@{1}: commit: second commitb0006bc HEAD@{2}: commit (initial): first commit# 切换到 b0006bc 版本,也就是第一次提交的版本abc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)$ git reset --hard b0006bcHEAD is now at b0006bc first commit# 切换完毕之后再查看历史记录,当前成功切换到了 b0006bc 版本abc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)$ git reflogb0006bc (HEAD -> master) HEAD@{0}: reset: moving to b0006bc41f776b HEAD@{1}: commit: third commit6967bf0 HEAD@{2}: commit: second commitb0006bc (HEAD -> master) HEAD@{3}: commit (initial): first commit# 然后查看文件 hello.txt,发现文件内容回到第一版本abc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)$ cat hello.txthello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!
当你在切换版本后,再更改文本内容提交:
abc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)$ vim hello.txtabc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)$ git statusOn branch masterChanges 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: hello.txtno changes added to commit (use "git add" and/or "git commit -a")abc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)$ git add hello.txtabc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)$ git commit -m "forth commit"[master 5f8dbf6] forth commit1 file changed, 1 insertion(+), 1 deletion(-)abc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)$ git reflog5f8dbf6 (HEAD -> master) HEAD@{0}: commit: forth commitb0006bc HEAD@{1}: reset: moving to b0006bc41f776b HEAD@{2}: commit: third commit6967bf0 HEAD@{3}: commit: second commitb0006bc HEAD@{4}: commit (initial): first commit
再次切换到第一版本:
abc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)$ git reset --hard b0006bcHEAD is now at b0006bc first commitabc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)$ git reflogb0006bc (HEAD -> master) HEAD@{0}: reset: moving to b0006bc5f8dbf6 HEAD@{1}: commit: forth commitb0006bc (HEAD -> master) HEAD@{2}: reset: moving to b0006bc41f776b HEAD@{3}: commit: third commit6967bf0 HEAD@{4}: commit: second commitb0006bc (HEAD -> master) HEAD@{5}: commit (initial): first commitabc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)$ cat hello.txthello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!hello, git!
Git 切换版本, 底层其实是移动的 HEAD 指针。
08.分支
什么是分支
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来, 开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)
分支的好处
同时并行推进多个功能开发,提高开发效率。
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
分支操作命令
1.查看分支:git branch -v
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ git branch -v* master 1eb2fb2 second commit
2.创建分支:git branch 分支名
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)#创建hot+-fix分支$ git branch hot-fixerhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)#再次查看分支可以看到之前创建的hot-fix分支$ git branch -vhot-fix 1eb2fb2 second commit* master 1eb2fb2 second commit
刚创建的新的分支,并将主分支master的内容复制了一份。
3.切换分支:git checkout 分支名
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)#切换hot-fix分支$ git checkout hot-fixSwitched to branch 'hot-fix'erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)#查看分支$ git branch -v* hot-fix 1eb2fb2 second commitmaster 1eb2fb2 second commit
切换分支后,在新分支修改文件:
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)$ vim hello.txterhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)$ cat hello.txthello Git!22222hot fixhello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)$ git statusOn branch hot-fixChanges 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: hello.txtno changes added to commit (use "git add" and/or "git commit -a")erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)$ git add hello.txtwarning: LF will be replaced by CRLF in hello.txt.The file will have its original line endings in your working directoryerhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)$ git commit -m "hot-fix first commmit"[hot-fix 38e0799] hot-fix first commmit1 file changed, 2 insertions(+), 1 deletion(-)erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)$ git reflog38e0799 (HEAD -> hot-fix) HEAD@{0}: commit: hot-fix first commmit1eb2fb2 (master) HEAD@{1}: checkout: moving from master to hot-fix1eb2fb2 (master) HEAD@{2}: reset: moving to 1eb2fb21eb2fb2 (master) HEAD@{3}: reset: moving to 1eb2fb21eb2fb2 (master) HEAD@{4}: commit: second commit4c9e1f0 HEAD@{5}: commit (initial): first commiterhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)$ git logcommit 38e07995526da81a660c2711765d9102494a327b (HEAD -> hot-fix)Author: syb <903923381@>Date: Fri Mar 18 14:15:46 +0800hot-fix first commmitcommit 1eb2fb245fbf8d5a28d35fb1072b80befb67e4c2 (master)Author: syb <903923381@>Date: Fri Mar 18 11:22:18 +0800second commitcommit 4c9e1f045b47f30f3e84c0a19ee4ac641762db9dAuthor: syb <903923381@>Date: Fri Mar 18 11:11:30 +0800first commit
4.合并分支(正常合并):git merge 分支名
在 master 分支上合并 hot-fix 分支(将hot-fix的合并到master)。
# 首先要切换到master分支上erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)$ git checkout masterSwitched to branch 'master'#将hot-fix的合并到mastererhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ git merge hot-fixUpdating 1eb2fb2..38e0799Fast-forwardhello.txt | 3 ++-1 file changed, 2 insertions(+), 1 deletion(-)#合并后,可以在master分支上看到hot-fix上分支对文件的修改erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ cat hello.txthello Git!22222hot fixhello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!#合并后,hot-fix分支依然存在,并未消失erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ git branch -vhot-fix 38e0799 hot-fix first commmit* master 38e0799 hot-fix first commmiterhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ git branch hot-fixfatal: a branch named 'hot-fix' already exists
5.冲突合并:
冲突产生的原因
并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。 Git 无法替我们决定使用哪一个,因此,必须人为决定新代码内容。
产生冲突
首先,在master修改文件hello.txt最后修改内容,并提交:
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ vim hello.txterhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ cat hello.txthello Git!22222hot fixmaster testhello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!
提交至本地库区:
#提交至暂存区erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ git add hello.txt#提交至本地库erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ git commit -m "master test" hello.txt[master 3288538] master test1 file changed, 1 insertion(+)
然后,在hot-fix修改文件hello.txt最后一行内容,并提交:
#切换至hot-fixerhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)$ vim hello.txt#查看修改erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)$ cat hello.txthello Git!22222hot fixhot fix testhello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!#提交暂存区erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)$ git add hello.txt#提交本地库erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)$ git commit -m "hot fix test" hello.txt[hot-fix 0dad068] hot fix test1 file changed, 1 insertion(+)
切换到master分支,然后将hot-fix分支的合并到master,冲突产生:
#切换分支erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)$ git checkout masterSwitched to branch 'master'#冲突产生 代码合并失败erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ git merge hot-fixAuto-merging hello.txtCONFLICT (content): Merge conflict in hello.txtAutomatic merge failed; fix conflicts and then commit the result.# MERGING 出现,表示有冲突待解决erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master|MERGING)$ git statusOn branch masterYou have unmerged paths.(fix conflicts and run "git commit")(use "git merge --abort" to abort the merge)Unmerged paths:(use "git add <file>..." to mark resolution)both modified: hello.txtno changes added to commit (use "git add" and/or "git commit -a")#查看 <<<当前分支的代码======要合并的代码>>>erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master|MERGING)$ cat hello.txthello Git!22222hot fix<<<<<<< HEADmaster test=======hot fix test>>>>>>> hot-fixhello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!
解决冲突
编辑有冲突的文件,删除特殊符号,决定要使用的内容
<<<<<<< HEAD当前分支的代码 ======= 合并过来的代码 >>>>>>> hot-fix
#选择要和合并的代码erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master|MERGING)$ vim hello.txterhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master|MERGING)$ cat hello.txthello Git!22222hot fixmaster testhot fix testhot-fixhello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!#提交后才能合并成功erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master|MERGING)$ git statusOn branch masterYou have unmerged paths.(fix conflicts and run "git commit")(use "git merge --abort" to abort the merge)Unmerged paths:(use "git add <file>..." to mark resolution)both modified: hello.txtno changes added to commit (use "git add" and/or "git commit -a")#提交暂存区erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master|MERGING)$ git add hello.txt#提交本地库 注意此时不能带文件名 否则会爆错erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master|MERGING)$ git commit -m "meger test"[master 1572ab3] meger test#查看是否提交成功erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ cat hello.txthello Git!22222hot fixmaster testhot fix testhot-fixhello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!
此时只会修改master 的内容 不会修改hot-fix的内容
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ git checkout hot-fixSwitched to branch 'hot-fix'erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)$ cat hello.txthello Git!22222hot fixhot fix testhello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!
5.Git团队协作机制
团队内协作
跨团队协作
6.GitHub操作
官网:GitHub: Where the world builds software · GitHub
创建远程仓库
1.登录:
登陆后点击右上角+号,选择new respository创建远程库
生成远程库链接
远程仓库操作
1.创建远程库别名:
git remote -v : 查看当前所有远程地址别名git remote add 别名 远程地址 :起别名#此时没有别名erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)$ git remote -v#创建别名erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)$ git remote add gitdemo /peacelovea/gitdemo.git#创建别名成功erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)$ git remote -vgitdemo /peacelovea/gitdemo.git (fetch)gitdemo /peacelovea/gitdemo.git (push)
2.推送本地库到远程仓库
基本语法:git push 别名 分支
将master分支推送到远程仓库:
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)$ git checkout masterSwitched to branch 'master'erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ cat hello.txthello Git!22222hot fixmaster testhot fix testhot-fixhello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!#网络可能失败erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ git push gitdemo masterfatal: unable to access '/peacelovea/gitdemo.git/': Failed to connect to port 443 after 21082 ms: Timed out
弹出github登录框
我这里选择第二个使用code登录
输入完code后
推送成功
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ git push gitdemo masterEnumerating objects: 18, done.Counting objects: 100% (18/18), done.Delta compression using up to 8 threadsCompressing objects: 100% (12/12), done.Writing objects: 100% (18/18), 1.35 KiB | 275.00 KiB/s, done.Total 18 (delta 5), reused 0 (delta 0), pack-reused 0remote: Resolving deltas: 100% (5/5), done.To /peacelovea/gitdemo.git* [new branch]master -> master
刷新github后,可以在远程库看到本地库的代码
3.远程库拉取到本地库
基本语法:git pull 别名 分支
在Github(远程库)上修改hello.txt文件,并提交。
拉去代码到本地库:
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ git pull gitdemo masterremote: Enumerating objects: 5, done.remote: Counting objects: 100% (5/5), done.remote: Compressing objects: 100% (2/2), done.remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0Unpacking objects: 100% (3/3), 690 bytes | 32.00 KiB/s, done.From /peacelovea/gitdemo* branch master-> FETCH_HEAD1572ab3..e61407f master-> gitdemo/masterUpdating 1572ab3..e61407fFast-forwardhello.txt | 1 +1 file changed, 1 insertion(+)erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ git statusOn branch masternothing to commit, working tree clean# 和Github代码一致erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ cat hello.txthello Git!22222hot fixmaster testhot fix testhot-fixhello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!Edit from Github first commit
4.克隆远程库到本地
基本语法:git clone 远程地址
创建一个新文件夹
在远程库获取地址URL
注意:在gitClone目录打开Bash命令
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitClone$ git clone /peacelovea/gitdemo.gitCloning into 'gitdemo'...remote: Enumerating objects: 21, done.remote: Counting objects: 100% (21/21), done.remote: Compressing objects: 100% (9/9), done.remote: Total 21 (delta 6), reused 17 (delta 5), pack-reused 0Receiving objects: 100% (21/21), done.Resolving deltas: 100% (6/6), done.#进入到gitdemoerhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitClone$ cd gitdemo#查看别名 erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitClone/gitdemo (master)$ git remote -vorigin /peacelovea/gitdemo.git (fetch)origin /peacelovea/gitdemo.git (push)
克隆成功
clone 会做如下操作:
拉取代码。初始化本地仓库。创建别名。
5.GitHub_团队内协作
一、选择邀请团队成员。(在仓库设置里操作)
二、填入成员账号,将成员添加到仓库。
三、复制邀请函(链接)发送给成员 ,如:/atguiguyueyue/git-shTest/invitations。
四、成员登陆账号在github,在浏览器复制链接,点击接受邀请。
五、成员邀请成功之后,可以在Github账号上看到将来共同开发远程仓库。
六、目标合作者可以修改内容并 push 到远程仓库。
# 编辑 clone 下来的文件Layne@LAPTOP-Layne MINGW64 /d/Git-Space/pro-linghuchong/git-shTest(master)$ vim hello.txtLayne@LAPTOP-Layne MINGW64 /d/Git-Space/pro-linghuchong/git-shTest(master)$ cat hello.txthello git! hello atguigu! 2222222222222hello git! hello atguigu! 33333333333333hello git! hello atguigu!hello git! hello atguigu!hello git! hello atguigu! 我是最帅的, 比岳不群还帅hello git! hello atguigu!hello git! hello atguigu!hello git! hello atguigu!hello git! hello atguigu!hello git! hello atguigu!hello git! hello atguigu!hello git! hello atguigu!hello git! hello atguigu!hello git! hello atguigu!hello git! hello atguigu! master testhello git! hello atguigu! hot-fix test# 将编辑好的文件添加到暂存区Layne@LAPTOP-Layne MINGW64 /d/Git-Space/pro-linghuchong/git-shTest(master)$ git add hello.txt# 将暂存区的文件上传到本地库Layne@LAPTOP-Layne MINGW64 /d/Git-Space/pro-linghuchong/git-shTest(master)$ git commit -m "lhc commit" hello.txt[master 5dabe6b] lhc commit1 file changed, 1 insertion(+), 1 deletion(-)# 将本地库的内容 push 到远程仓库Layne@LAPTOP-Layne MINGW64 /d/Git-Space/pro-linghuchong/git-shTest(master)$ git push origin masterLogon failed, use ctrl+c to cancel basic credential prompt.Username for '': atguigulinghuchongCounting objects: 3, done.Delta compression using up to 12 pressing objects: 100% (2/2), done.Writing objects: 100% (3/3), 309 bytes | 309.00 KiB/s, done.Total 3 (delta 1), reused 0 (delta 0)remote: Resolving deltas: 100% (1/1), completed with 1 local object.To /atguiguyueyue/git-shTest.git7cb4d02..5dabe6b master -> master
七.回到发送合作邀请者的 GitHub 远程仓库中可以看到,最后一次是目标合作者提交的。
6.GitHub_跨团队协作
一、将远程仓库的地址复制发给邀请跨团队协作的人,比如东方不败。
或者直接搜索项目名称
二、在东方不败的 GitHub 账号里的地址栏复制收到的链接,然后点击 网页右上方的Fork按钮,将项目叉到自己的本地仓库
叉成功后可以看到当前仓库信息。
三、东方不败就可以在线编辑叉取过来的文件。
四、编辑完毕后,填写描述信息并点击左下角绿色按钮提交。
五、接下来点击上方的 Pull 请求,并创建一个新的请求。
六、回到岳岳 GitHub 账号可以看到有一个 Pull request 请求。
进入到聊天室,可以讨论代码相关内容。
七、如果代码没有问题,可以点击 Merge pull reque 合并代码。
7.GitHub_SSH免密登录
远程仓库中还有一个 SSH 的地址,因此我们也可以使用 SSH 进行访问。
这里提示没有ssh密钥
先到用户的主页目录,删除.ssh文件夹(如果没有.ssh文件夹,忽略此步)
打开Git Bash,运行命令ssh-keygen生成.ssh目录 敲三次回车:
erhang@DESKTOP-PNIJAHF MINGW64 ~$ ssh-keygen -t rsa -C Generating public/private rsa key pair.Enter file in which to save the key (/c/Users/erhang/.ssh/id_rsa):Created directory '/c/Users/erhang/.ssh'.Enter passphrase (empty for no passphrase):Enter same passphrase again:Your identification has been saved in /c/Users/erhang/.ssh/id_rsaYour public key has been saved in /c/Users/erhang/.ssh/id_rsa.pubThe key fingerprint is:SHA256:内容...The key's randomart image is:+---[RSA 3072]----+| ....E .== || . o+++ . ... || o oB=.+ .|| o ++==o.|| =.o*S..|| . B o+o.. || * *o || . o...|| .++.|+----[SHA256]-----+
重新生成了.ssh目录
查看公钥
erhang@DESKTOP-PNIJAHF MINGW64 ~$ cd .ssherhang@DESKTOP-PNIJAHF MINGW64 ~/.ssh$ cat id_rsa.pubssh-rsa .............
将生成的公钥添加至Github账号SSH设置
打开setting/SSH and GPG keys
添加成功
添加公钥后,可不用输入Github账号密码便可推送。
接下来通过SSH方式提交hello.txt。
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ cat hello.txthello Git!22222hot fixmaster testhot fix testhot-fixhello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!hello Git!Edit from Github first commit#修改本地仓erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ vim hello.txterhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ git add hello.txterhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ git statusOn branch masterChanges to be committed:(use "git restore --staged <file>..." to unstage)modified: hello.txterhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ git commit -m "ssh test"[master 81efd31] ssh test1 file changed, 1 insertion(+)# 通过SSH推送erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)$ git push git@:peacelovea/gitdemo.gitEnumerating objects: 5, done.Counting objects: 100% (5/5), done.Delta compression using up to 8 threadsCompressing objects: 100% (2/2), done.Writing objects: 100% (3/3), 270 bytes | 270.00 KiB/s, done.Total 3 (delta 1), reused 0 (delta 0), pack-reused 0remote: Resolving deltas: 100% (1/1), completed with 1 local object.To :peacelovea/gitdemo.gite61407f..81efd31 master -> master
推送成功。
7.IDEA集成Git
环境准备
1.配置 Git 忽略文件
如:
为什么忽略:
一般我们只希望保存pom文件和代码,这些文件与项目的实际功能无关,不参与服务器上部署运行。把它们忽略掉能够屏蔽 IDE 工具之间的差异。例如,Maven工程根据src生成的target。
怎么忽略:
1.创建忽略文件XXXX.ignore(前缀名随便起,建议是git.ignore),这个文件的存放位置原则上哪里都可以,为了便于~/.gitconfig文件引用,建议也放在用户家目录下
git.ignore 文件模版内容如下:
# Compiled class file*.class# Log file*.log# BlueJ files*.ctxt# Mobile Tools for Java (J2ME).mtj.tmp/# Package Files #*.jar*.war*.nar*.ear*.zip*.tar.gz*.rar# virtual machine crash logs, see /en/download/help/error_hotspot.xmlhs_err_pid*.classpath.project.settingstarget.idea*.iml
将文件模板复制到git.ignore后
在.gitconfig 文件中引用忽略配置文件(此文件也在 Windows 的家目录中)
[user]name = sybemail = xxxxxxxx@[core]excludesfile = C:/Users/erhang/git.ignore
注意:这里要使用“正斜线(/)”,不要使用“反斜线(\)”
2.idea中定位Git程序
打开设置
选中bin/git.exe
点击右上角test,弹出git的版本,保存配置,定位成功
3.初始化Git
点击导航栏VCS,选择create git repository
选中项目的根目录(默认就选中了),点击ok
可以看到项目根目录出现了.git文件
同时项目颜色变成了红色(git红色表示文件未被追踪,即文件还没被添加到暂存区)
4.添加到暂存区
这里我创建一个名叫HelloGit的Maven工程。重复3的操作
创建一个HelloGit类,将其添加Git暂存区。
创建完类后idea会自动提醒是否添加暂存区。
点击add,该类变绿色(绿色说明添加到了暂存区,还没有添加到本地库)
也可以右键单击文件,Git->add,手动添加
也可以将这整个项目一次性add,右键单击文件根目录,手动add
5.提交本地库
右键单击项目根目录,选择Git->Commit Directory。
添加成功,控制待打印信息
被提交的类变为正常的黑色
6.切换版本
修改一行代码
此时被修改的文件变蓝,蓝色说明被追踪过但是又被修改了
我们要重新add,commit,可以看到代码的不同
再添加第三个版本,
因为已经被被追踪过,这里我们可以直接commit
此时有三个版本了
可以看到修改信息
切换版本:
右键选择要切换的版本,然后在菜单里点击 Checkout Revision。
此时头指针指向第二版本,文件也变为第二版本的文件
7.创建分支
右键点击HelloGit,Git -> Branches,或者点击IDEA的右下角,点击New Branche:
或:
弹出框,输入分支名:
8.切换分支
点击右下角分支选择checkout,可以切换分支
或者在log窗口,右键点击分支,选择checkout:
9.合并分支(正常合并)
在hot-fix分支修改类并commit提交:
切换到master分支
我们要将hot-fix分支合并到master分支:
点击右下角master,选择hot-fix分支,选择Merge into Current
如果代码没有冲突, 分支直接合并成功,分支合并成功以后,代码自动提交,无需手动提交本地库。
10.合并分支(冲突合并)
分别在master,hot-fix分支修改HelloGit类同一行,并提交,故意制作冲突:
此时两分支代码是一样的,我们切换到hot-fix分支,修改一行代码
提交,
提交成功后,切换到master分支,修改同样位置代码
提交
这里我不小心创建了两个
在master分支上合并hot-fix分支
点击Merge into Current,弹出冲突框,点击Merge手动合并
点击apply,合并成功,自动提交本地库
查看日志信息,可以看到hot-fix-commit-2和master commit-2合并成了一个版本
IDEA集成GitHub
1.设置GitHub账号
在菜单栏File->Setting->搜索栏搜GitHub,添加GitHub账号:
弹出网页,授权即可
2.分享项目到GitHub
在github主页可以看到项目
点击History可以看到本地库对应的版本
3.push推送代码到远程库
注意: push 是将本地库代码推送到远程库,如果本地库代码跟远程库代码版本不一致, push 的操作是会被拒绝的。也就是说, 要想 push 成功,一定要保证本地库的版本要比远程库的版本高! 因此一个成熟的程序员在动手改本地代码之前,一定会先检查下远程库跟本地代码的区别!如果本地的代码版本已经落后,切记要先 pull 拉取一下远程库的代码,将本地代码更新到最新以后,然后再修改,提交,推送!
https协议push
在app类中新增一行代码push test并提交到本地库
此时远程库是没有该代码的,点击Git->push
push成功
在远程库可以看到新增代码
ssh协议push
如果由于网络问题,无法push,我们之前设置过ssh免密登录,也可以用ssh方式push
在远程库HelloGit中,复制ssh链接
app类新增代码并提交到本地库
点击push,选择ssh push commit,点击push
push成功
回到github主页可以看到代码push成功
注意:如果你开的有vpn,https很快就能push,但是ssh会因为网络代理的问题push失败,ssh方式push时把vpn关掉
4.pull拉取远程库到本地库
我们在远程库即github主页对代码进行更新,并提交
此时远程库的代码已经比本地库的代码更新了
注意: pull 是拉取远端仓库代码到本地,如果远程库代码和本地库代码不一致,会自动 合并,如果自动合并失败,还会涉及到手动解决冲突的问题,所以在pull时尽量不要改写本地库的代码。
右键点击项目,可以将远程仓库的内容 pull 到本地仓库:
拉取成功
注意:我这里pull fail了好几次,原因是开启了vpn 关掉即可
5.clone远程库代码到本地
我们已经把代码托管到了github上,本地的代码相当于一个备份,这里我直接删除HelloGit项目,利用clone 将代码重新克隆到本地
1.删除项目
2.重新打开idea
在GitHub主页上复制HelloGit项目的链接,我这里复制的是ssh链接
Clone成功后,项目从远程库重新克隆到了本地
Gitee(码云)
简介
GitHub 服务器在国外, 使用 GitHub 作为项目托管网站,如果网速不好的话,严重影响使用体验,甚至会出现登录不上的情况。针对这个情况, 大家也可以使用国内的项目托管网站-码云。使用方式跟 GitHub 一样,而且它还是一个中文网站,如果你英文不是很好,它是最好的选择。
官网:
账号注册登录
…
创建远程库
跟Github的类似。点击+号->新建仓库
也可以从GitHub与GitLab中导入仓库。
创建成功
IDEA集成Gitee
首先,要在IDEA安装Gitee插件。
在菜单栏选File->Settings->Plugins,搜Gitee。
安装插件成功后,重启IDEA。
功能跟在IDEA的Github插件,功能类似,如添加Gitee账号等,可参考IDEA的Github插件。
连接码云,和之前类似:
push推送代码到远程库
可以将本地项目发布到码云上
如果不想点这个,也可以用push推送到码云仓库
打开码云主页,可以看到项目成功被push到远程仓
演示一下完整过程:
本地库新增一行代码
提交
选择码云的链接push
push成功:
pull拉取代码到本地库
在gitee上修改项目,并提交
选pull按钮,这里要选择码云的路径,不要pull错了
pull成功
clone远程库代码到本地库
1.关闭idea,将项目删除
2.重新打开idea
选择gitee的项目
clone成功
码云复制GitHub
Gitee可以把GitHub的项目迁移到Gitee上,迁移后可以进行同步刷新,不再赘述
如果觉得《git学习笔记[idea整合GitHub Gitee](非常详细)》对你有帮助,请点赞、收藏,并留下你的观点哦!