目录
一、Git常用命令
二、Git分支操作
1.什么是分支?
2.关于分支的操作
三、Git团队协作机制
四、GitHub操作
五、IDEA集成Git
六、IDEA集成GitHub
七、国内代码托管中心—码云
git基本组成框架:Workspace、Stage、Repository、Remote
Workspace:开发者工作区,当前写代码的目录Stage:暂存区/缓存区Repository:本地仓库,本地所有的提交都会保存在这里,git会保存好每一个历史版本Remote:远程仓库,服务器仓库
一、Git常用命令
1.设置用户签名
CC@LAPTOP-R4VGGC1O MINGW64 ~# git config --global user.name 用户名
文件保存在:C:\Users\CC\.gitconfig
2.初始化本地库
git init 初始化当前目录为仓库,初始化后会自动将当前仓库设置为master
3.查看本地库状态
git status
# git statusOn branch masterNo commits yetnothing to commit (create/copy files and use "git add" to track)CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)$
新建文件并输入内容
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# vim hello.txt# lltotal 1-rw-r--r-- 1 CC 197121 11 Nov 14 22:13 hello.txtCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# cat hello.txthello git!
再次查看本地库状态
解释:untracked 原先没有的,新建的
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git statusOn branch masterNo commits yetUntracked files:(use "git add <file>..." to include in what will be committed)hello.txtnothing added to commit but untracked files present (use "git add" to track)
4.添加暂存区
git add文件名
这里要说明一点,当我们使用git add将文件提交到暂存区以后,我们在修改这个文件时,它跟暂存区内容是没有任何关系的!我们使用git commit提交时,它只会提交暂存区中的内容,当我们首次提交内容到暂存区后,我又修改了一下文件内容,如果想提交第二次修改,我们只需要再git add一次,然后再次使用git commit提交就可以了!
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (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 directory
再次查看本地库状态,git已经追踪到了我们添加的文件,此时文件只是存在暂存区里面
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git statusOn branch masterNo commits yetChanges to be committed:(use "git rm --cached <file>..." to unstage)new file: hello.txt
git rm --cached 文件名
从暂存区里面删除文件可采用上述命令,但是不会对工作区产生影响,文件仍然存在工作区里面!
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git rm --cached hello.txtrm 'hello.txt'
5.提交本地库
将暂存区的文件提交到本地库
git commit -m "日志信息" 文件名
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git commit -m "first 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 (root-commit) 689e0ac] first commit1 file changed, 1 insertion(+)create mode 100644 hello.txt
再次查看本地库状态
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git statusOn branch masternothing to commit, working tree clean
简单查看版本信息 689e0ac是版本号的简略写法
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git reflog689e0ac (HEAD -> master) HEAD@{0}: commit (initial): first commit
更详细的信息:git log
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git logcommit 689e0acc5cb9a374eb448a5ee4b73adf8a8b5924 (HEAD -> master)Author: chen <1424861923@>Date: Sun Nov 14 22:29:20 +0800first commit
6.修改文件内容,模拟版本更替
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# cat hello.txthello git!CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# vim hello.txtCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# cat hello.txthello hello hello hello hello!CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (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.txt
修改后的文件添加到暂存区
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (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 directoryCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git statusOn branch masterChanges to be committed:(use "git restore --staged <file>..." to unstage)modified: hello.txt
提交到本地库
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (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 6843ece] second commit1 file changed, 1 insertion(+), 1 deletion(-)
再次查看本地库状态!
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git statusOn branch masternothing to commit, working tree clean
查看版本信息,指针指向第二个版本
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git reflog6843ece (HEAD -> master) HEAD@{0}: commit: second commit689e0ac HEAD@{1}: commit (initial): first commit
7.版本穿梭
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git reflog6843ece (HEAD -> master) HEAD@{0}: commit: second commit689e0ac HEAD@{1}: commit (initial): first commitCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git reset --hard 689e0acHEAD is now at 689e0ac first commitCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git reflog689e0ac (HEAD -> master) HEAD@{0}: reset: moving to 689e0ac6843ece HEAD@{1}: commit: second commit689e0ac (HEAD -> master) HEAD@{2}: commit (initial): first commitCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# cat hello.txthello git!
可以看到指针切换,指向了第一个版本
二、Git分支操作
1.什么是分支?
在版本控制过程中,同时推进多个任务,我们可以为每个任务创建单独的分支,使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行,对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本,分支底层其实也是指针的引用,使用分支可以同时并行推进多个功能模块的开发,提高开发效率,各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响,只需要将失败的分支删除,然后重新开始即可!2.关于分支的操作
查看分支 git branch单纯查看有哪些分支
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git branchaahot-fix* master
查看分支 git branch -v包括提交信息
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git branch -v* master 689e0ac first commit
创建分支,并切换到该分支上 git checkout -b 分支名相当于以下两条命令
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git checkout -b bbSwitched to a new branch 'bb'
创建分支 git branch 分支名
现在我们使用该命令创建一个分支:hot-fix
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git branch hot-fixCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git branch -vhot-fix 689e0ac first commit* master 689e0ac first commit
切换分支 git checkout 分支名
切换到hot-fix分支上,然后修改文件hello.txt
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git checkout hot-fixSwitched to branch 'hot-fix'CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (hot-fix)# git branch -v* hot-fix 689e0ac first commitmaster 689e0ac first commitCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (hot-fix)# vim hello.txtCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (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")
提交hot-fix分支修改后的文件到暂存区,然后是本地库
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (hot-fix)# git add hello.txtCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (hot-fix)# git statusOn branch hot-fixChanges to be committed:(use "git restore --staged <file>..." to unstage)modified: hello.txtCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (hot-fix)# git commit -m "hot-fix first commit" hello.txt[hot-fix 954a043] hot-fix first commit1 file changed, 1 insertion(+)CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (hot-fix)# cat hello.txthello git!hot-fix complete!
当切换到master分支上查看文件内容时,发现文件内容还是之前的内容,也就是说hot-fix和master之间还没有建立任何联系!
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (hot-fix)# git checkout masterSwitched to branch 'master'CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# cat hello.txthello git!
合并分支 git merge 分支名
基于当前分支,合并另外一个分支,前提是需要保证分支之间不发生冲突!
冲突产生的原因:两个分支在同一个文件的同一个位置有两套完全不同的修改,git无法决定我们使用哪一个,必须人为决定使用哪一个!
下面我们站在master分支,将hot-fix分支合并过来!然后再次查看文件内容,可以看到在hot-fix分支上所做的修改已经同步过来了!
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git merge hot-fixUpdating 689e0ac..954a043Fast-forwardhello.txt | 1 +1 file changed, 1 insertion(+)CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# cat hello.txthello git!hot-fix complete!
两个分支合并过之后,下面看一个分支冲突的演示案例:同时修改master分支和hot-fix分支中的hello.txt文件,并且都提交到暂存区和本地库,当再次站在master分支上合并hot-fix分支时,出现了冲突问题!
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# vim hello.txtCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# cat hello.txtmaster test!CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git add hello.txtCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git commit -m "test" hello.txt[master e8d15b7] test1 file changed, 1 insertion(+), 2 deletions(-)CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git checkout hot-fixSwitched to branch 'hot-fix'CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (hot-fix)# vim hello.txtCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (hot-fix)# cat hello.txthot-fix testhot-fix complete!CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (hot-fix)# git add hello.txtCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (hot-fix)# git commit -m "test" hello.txt[hot-fix b33ba3d] test1 file changed, 1 insertion(+), 1 deletion(-)CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (hot-fix)# git checkout masterSwitched to branch 'master'CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git merge hot-fixAuto-merging hello.txtCONFLICT (content): Merge conflict in hello.txtAutomatic merge failed; fix conflicts and then commit the @LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master|MERGING)$
我们也可以使用git status来查看冲突信息
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (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")
如何解决冲突问题:修改文件,打开文件之后git会将有冲突的地方(通过符号)展示出来,只需要将其修改,然后删除特殊符号、保存、提交到暂存区,最后提交到本地库(注意此时使用commit命令不能带文件名)
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master|MERGING)# vim hello.txtCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master|MERGING)# git add hello.txtCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master|MERGING)# git commit -m "merge test"[master 89fa447] merge testCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)$
删除分支git branch -d 分支名
如果你想删除的分支没有合并,删除分支就意味着会丢失数据,此时git无法使用-d删除,可使用-D强制删除git branch -D 分支名
三、Git团队协作机制
1.团队内协作
2.跨团队协作
四、GitHub操作
git remote -v 查看当前所有远程地址别名
git remote add 别名 远程地址(https方式/ssh方式)添加远程仓库并起别名
git push 别名 分支 推送本地分支上的内容到远程仓库
git clone 远程地址 将远程仓库的内容克隆到本地(从无到有)
不能使用别名默认情况下,从远程克隆到本地库只能看到master分支,如果要将远程的分支同步到本地可以使用:
git pull 远程库地址别名 远程分支名 将远程仓库对应分支最新内容拉取下来后与本地当前分支直接合并
4.1Github新建远程仓库
登录GitHub,打开创建仓库界面
输入远程仓库名,设置共享方式为public,点击创建
可以看到仓库已经创建好了,并且有https/ssh两个地址
4.2本机与远程仓库关联
在本机打开Git Bash命令窗口,添加远程仓库,并起一个在本机使用的别名,如下面的代码所示,我起的别名是 git-demo
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git remote add git-demo /chenstudyJava/myfirst-git-Repository.gitCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git remote -vgit-demo /chenstudyJava/myfirst-git-Repository.git (fetch)git-demo /chenstudyJava/myfirst-git-Repository.git (push)
推送本地分支上的内容到远程仓库
此时会弹出一个窗口让你登录,这里我先选择打开浏览器认证登录
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git push git-demo masterEnumerating objects: 18, done.Counting objects: 100% (18/18), done.Delta compression using up to 8 threadsCompressing objects: 100% (6/6), done.Writing objects: 100% (18/18), 1.34 KiB | 229.00 KiB/s, done.Total 18 (delta 0), reused 0 (delta 0), pack-reused 0To /chenstudyJava/myfirst-git-Repository.git* [new branch]master -> master
然后刷新远程仓库,可以看到
现在我在远程库修改hello.txt文件,增加了第四行的语句
提交
使用git pull命令将远程仓库的最新内容同步到本地git pull 远程库地址别名 远程分支名
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git pull git-demo masterremote: Enumerating objects: 5, done.remote: Counting objects: 100% (5/5), done.remote: Compressing objects: 100% (2/2), done.remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0Unpacking objects: 100% (3/3), 655 bytes | 109.00 KiB/s, done.From /chenstudyJava/myfirst-git-Repository* branch master-> FETCH_HEAD89fa447..f4b88ac master-> git-demo/masterUpdating 89fa447..f4b88acFast-forwardhello.txt | 1 +1 file changed, 1 insertion(+)CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git statusOn branch masternothing to commit, working tree cleanCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# cat hello.txttest!test!hot-fix complete!hehehehehehehehehehehehehehehehehe
4.3克隆仓库
新建文件夹git-clone,进入目录打开窗口,输入克隆命令(图中红框部分)
克隆会自动帮我们做如下3个操作:
拉取代码初始化本地仓库创建别名
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-clone# lltotal 0drwxr-xr-x 1 CC 197121 0 Nov 15 18:02 myfirst-git-Repository/CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-clone# cd myfirst-git-Repository/CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-clone/myfirst-git-Repository (master)# git remote -vorigin /chenstudyJava/myfirst-git-Repository.git (fetch)origin /chenstudyJava/myfirst-git-Repository.git (push)
添加团队成员,添加之后该成员可以push推送代码
4.4ssh免密登录
复制公钥
打开settings
添加
测试
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git pull git@:chenstudyJava/myfirst-git-Repository.git masterThe authenticity of host ' (20.205.243.166)' can't be established.RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.This key is not known by any other namesAre you sure you want to continue connecting (yes/no/[fingerprint])? yesWarning: Permanently added '' (RSA) to the list of known hosts.From :chenstudyJava/myfirst-git-Repository* branch master-> FETCH_HEADAlready up to @LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# cat hello.txttest!test!hot-fix complete!hehehehehehehehehehehehehehehehehe
测试push命令
CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# cat hello.txttest!test!hot-fix complete!heheheheheheheheheheheheheheheheheCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# vim hello.txtCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# cat hello.txttest!test!hot-fix complete!hehehehehehehehehehehehehehehehehessh 果然方便!CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git add hello.txtCC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git commit -m "ssh ceshi" hello.txt[master 1bd2320] ssh ceshi1 file changed, 1 insertion(+)CC@LAPTOP-R4VGGC1O MINGW64 /e/Git/git-demo (master)# git push git@:chenstudyJava/myfirst-git-Repository.git masterEnumerating 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), 285 bytes | 142.00 KiB/s, done.Total 3 (delta 0), reused 0 (delta 0), pack-reused 0To :chenstudyJava/myfirst-git-Repository.gitf4b88ac..1bd2320 master -> master
远程仓库查看
五、IDEA集成Git
在C:\Users\CC目录下新建文件
复制忽略内容到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
引用忽略文件
IDEA引入
将项目交给git管理
切换到本地
文件添加到暂存区
查看版本
创建新的分支
合并分支
合并结果
六、IDEA集成GitHub
IDEA登录
分享项目到GitHub
添加信息
登录远程库查看结果
七、国内代码托管中心—码云
IDEA登录
测试push
提交