Git 是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。
Git 易于学习,占地面积小,性能极快。 它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。 其性能优于 Subversion、 CVS、 Perforce 和 ClearCase 等版本控制工具。
Git官网:Git (git-scm.com)
版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。
版本控制其实最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换。
从个人开发过度到团队协作
集中化的版本控制系统诸如 CVS、 SVN 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。
这种做法带来了许多好处,每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个集中化的版本控制系统, 要远比在各个客户端上维护本地数据库来得轻松容易。
事分两面,有好有坏。这么做显而易见的缺点是中央服务器的单点故障。如果服务器宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。
Git、 Mercurial、 Bazaar、 Darcs……
像 Git 这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整地镜像下来(本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一 次文件提取操作,实际上都是一次对整个文件仓库的完整备份。
分布式的版本控制系统出现之后,解决了集中式版本控制系统的缺陷:
1.服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的)
2.每个客户端保存的也都是整个完整的项目(包含历史记录, 更加安全)
局域网
在官网下载git的安装包
选择安装目录,next
选择默认编辑器
总结:一路next
查看版本:安装成功
说明:签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。 Git 首次安装必须设置一下用户签名,否则无法提交代码。
注意: 这里设置用户签名和将来登录 GitHub(或其他代码托管中心)的账号没有任何关系。
打开Git Bash
无误,则用户签名设置完成
案例:新建一个文件夹,当前目录进入Bash命令界面
创建了一个名为.git非空隐藏文件夹
查看工作区有hello.txt,但是没有提交到暂存区
此时hello.txt已经提交在暂存区,git可以追踪到
再次查看
查看日志:
git log与git reflog区别
git log 命令可以显示所有提交过的版本信息,如果感觉太繁琐,可以加上参数 --pretty=oneline,只会显示版本号和提交时的备注信息。
git reflog 可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)。例如,执行 git reset --hard HEAD~1,退回到上一个版本,用git log则是看不出来被删除的commitid,用git reflog则可以看到被删除的commitid,我们就可以买后悔药,恢复到被删除的那个版本
修改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 status
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
modified: hello.txt
no 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.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ git status
On branch master
Changes to be committed:
(use "git restore --staged ..." to unstage)
modified: hello.txt
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
//第二次提交
$ git commit -m "second commit" hello.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory
[master 1eb2fb2] second commit
1 file changed, 1 insertion(+), 1 deletion(-)
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ git log
commit 1eb2fb245fbf8d5a28d35fb1072b80befb67e4c2 (HEAD -> master)
Author: syb <[email protected]>
Date: Fri Mar 18 11:22:18 2022 +0800
second commit
commit 4c9e1f045b47f30f3e84c0a19ee4ac641762db9d
Author: syb <[email protected]>
Date: Fri Mar 18 11:11:30 2022 +0800
first commit
# 首先查看当前的历史记录
abc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)
$ git reflog
41f776b (HEAD -> master) HEAD@{0}: commit: third commit
6967bf0 HEAD@{1}: commit: second commit
b0006bc HEAD@{2}: commit (initial): first commit
# 切换到 b0006bc 版本,也就是第一次提交的版本
abc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)
$ git reset --hard b0006bc
HEAD is now at b0006bc first commit
# 切换完毕之后再查看历史记录,当前成功切换到了 b0006bc 版本
abc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)
$ git reflog
b0006bc (HEAD -> master) HEAD@{0}: reset: moving to b0006bc
41f776b HEAD@{1}: commit: third commit
6967bf0 HEAD@{2}: commit: second commit
b0006bc (HEAD -> master) HEAD@{3}: commit (initial): first commit
# 然后查看文件 hello.txt,发现文件内容回到第一版本
abc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)
$ cat hello.txt
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!
当你在切换版本后,再更改文本内容提交:
abc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)
$ vim hello.txt
abc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)
$ git status
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
modified: hello.txt
no changes added to commit (use "git add" and/or "git commit -a")
abc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)
$ git add hello.txt
abc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)
$ git commit -m "forth commit"
[master 5f8dbf6] forth commit
1 file changed, 1 insertion(+), 1 deletion(-)
abc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)
$ git reflog
5f8dbf6 (HEAD -> master) HEAD@{0}: commit: forth commit
b0006bc HEAD@{1}: reset: moving to b0006bc
41f776b HEAD@{2}: commit: third commit
6967bf0 HEAD@{3}: commit: second commit
b0006bc HEAD@{4}: commit (initial): first commit
再次切换到第一版本:
abc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)
$ git reset --hard b0006bc
HEAD is now at b0006bc first commit
abc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)
$ git reflog
b0006bc (HEAD -> master) HEAD@{0}: reset: moving to b0006bc
5f8dbf6 HEAD@{1}: commit: forth commit
b0006bc (HEAD -> master) HEAD@{2}: reset: moving to b0006bc
41f776b HEAD@{3}: commit: third commit
6967bf0 HEAD@{4}: commit: second commit
b0006bc (HEAD -> master) HEAD@{5}: commit (initial): first commit
abc@DESKTOP-R85C9HV MINGW64 ~/Desktop/HelloGit (master)
$ cat hello.txt
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!
Git 切换版本, 底层其实是移动的 HEAD 指针。
什么是分支
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来, 开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)
分支的好处
同时并行推进多个功能开发,提高开发效率。
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ git branch -v
* master 1eb2fb2 second commit
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
#创建hot+-fix分支
$ git branch hot-fix
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
#再次查看分支可以看到之前创建的hot-fix分支
$ git branch -v
hot-fix 1eb2fb2 second commit
* master 1eb2fb2 second commit
刚创建的新的分支,并将主分支master的内容复制了一份。
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
#切换hot-fix分支
$ git checkout hot-fix
Switched to branch 'hot-fix'
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)
#查看分支
$ git branch -v
* hot-fix 1eb2fb2 second commit
master 1eb2fb2 second commit
切换分支后,在新分支修改文件:
erhang@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.txt
hello Git!22222
hot fix
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!
hello Git!
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)
$ git status
On branch hot-fix
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
modified: hello.txt
no 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.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)
$ git commit -m "hot-fix first commmit"
[hot-fix 38e0799] hot-fix first commmit
1 file changed, 2 insertions(+), 1 deletion(-)
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)
$ git reflog
38e0799 (HEAD -> hot-fix) HEAD@{0}: commit: hot-fix first commmit
1eb2fb2 (master) HEAD@{1}: checkout: moving from master to hot-fix
1eb2fb2 (master) HEAD@{2}: reset: moving to 1eb2fb2
1eb2fb2 (master) HEAD@{3}: reset: moving to 1eb2fb2
1eb2fb2 (master) HEAD@{4}: commit: second commit
4c9e1f0 HEAD@{5}: commit (initial): first commit
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)
$ git log
commit 38e07995526da81a660c2711765d9102494a327b (HEAD -> hot-fix)
Author: syb <[email protected]>
Date: Fri Mar 18 14:15:46 2022 +0800
hot-fix first commmit
commit 1eb2fb245fbf8d5a28d35fb1072b80befb67e4c2 (master)
Author: syb <[email protected]>
Date: Fri Mar 18 11:22:18 2022 +0800
second commit
commit 4c9e1f045b47f30f3e84c0a19ee4ac641762db9d
Author: syb <[email protected]>
Date: Fri Mar 18 11:11:30 2022 +0800
first commit
在 master 分支上合并 hot-fix 分支(将hot-fix的合并到master)。
# 首先要切换到master分支上
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)
$ git checkout master
Switched to branch 'master'
#将hot-fix的合并到master
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ git merge hot-fix
Updating 1eb2fb2..38e0799
Fast-forward
hello.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
#合并后,可以在master分支上看到hot-fix上分支对文件的修改
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ cat hello.txt
hello Git!22222
hot fix
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!
hello Git!
#合并后,hot-fix分支依然存在,并未消失
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ git branch -v
hot-fix 38e0799 hot-fix first commmit
* master 38e0799 hot-fix first commmit
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ git branch hot-fix
fatal: a branch named 'hot-fix' already exists
冲突产生的原因
并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。 Git 无法替我们决定使用哪一个,因此,必须人为决定新代码内容。
产生冲突
首先,在master修改文件hello.txt最后修改内容,并提交:
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ vim hello.txt
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ cat hello.txt
hello Git!22222
hot fix
master test
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!
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 test
1 file changed, 1 insertion(+)
然后,在hot-fix修改文件hello.txt最后一行内容,并提交:
#切换至hot-fix
erhang@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.txt
hello Git!22222
hot fix
hot fix test
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!
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 test
1 file changed, 1 insertion(+)
切换到master分支,然后将hot-fix分支的合并到master,冲突产生:
#切换分支
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)
$ git checkout master
Switched to branch 'master'
#冲突产生 代码合并失败
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ git merge hot-fix
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then commit the result.
# MERGING 出现,表示有冲突待解决
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master|MERGING)
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add ..." to mark resolution)
both modified: hello.txt
no 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.txt
hello Git!22222
hot fix
<<<<<<< HEAD
master test
=======
hot fix test
>>>>>>> hot-fix
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!
hello Git!
解决冲突
编辑有冲突的文件,删除特殊符号,决定要使用的内容
<<<<<<< HEAD
当前分支的代码
=======
合并过来的代码
>>>>>>> hot-fix
#选择要和合并的代码
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master|MERGING)
$ vim hello.txt
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master|MERGING)
$ cat hello.txt
hello Git!22222
hot fix
master test
hot fix test
hot-fix
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!
hello Git!
#提交后才能合并成功
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master|MERGING)
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add ..." to mark resolution)
both modified: hello.txt
no 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.txt
hello Git!22222
hot fix
master test
hot fix test
hot-fix
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!
hello Git!
此时只会修改master 的内容 不会修改hot-fix的内容
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ git checkout hot-fix
Switched to branch 'hot-fix'
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)
$ cat hello.txt
hello Git!22222
hot fix
hot fix test
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!
hello Git!
官网:GitHub: Where the world builds software · GitHub
创建远程仓库
1.登录:
登陆后点击右上角+号,选择new respository创建远程库
生成远程库链接
远程仓库操作
命令名称 | 作用 |
---|---|
git remote -v | 查看当前所有远程地址别名 |
git remote add 别名 远程地址 | 起别名 |
git push 别名 分支 | 推送本地分支上的内容到远程仓库 |
git clone 远程地址 | 将远程仓库的内容克隆到本地 |
git pull 远程库地址别名 远程分支名 | 将远程仓库对于分支最新内容拉下来后与 当前本地分支直接合并 |
#此时没有别名
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 https://github.com/peacelovea/gitdemo.git
#创建别名成功
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)
$ git remote -v
gitdemo https://github.com/peacelovea/gitdemo.git (fetch)
gitdemo https://github.com/peacelovea/gitdemo.git (push)
基本语法:git push 别名 分支
将master分支推送到远程仓库:
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (hot-fix)
$ git checkout master
Switched to branch 'master'
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ cat hello.txt
hello Git!22222
hot fix
master test
hot fix test
hot-fix
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!
hello Git!
#网络可能失败
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ git push gitdemo master
fatal: unable to access 'https://github.com/peacelovea/gitdemo.git/': Failed to connect to github.com port 443 after 21082 ms: Timed out
弹出github登录框
我这里选择第二个使用code登录
输入完code后
推送成功
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ git push gitdemo master
Enumerating objects: 18, done.
Counting objects: 100% (18/18), done.
Delta compression using up to 8 threads
Compressing 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 0
remote: Resolving deltas: 100% (5/5), done.
To https://github.com/peacelovea/gitdemo.git
* [new branch] master -> master
刷新github后,可以在远程库看到本地库的代码
基本语法:git pull 别名 分支
在Github(远程库)上修改hello.txt文件,并提交。
拉去代码到本地库:
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ git pull gitdemo master
remote: 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 0
Unpacking objects: 100% (3/3), 690 bytes | 32.00 KiB/s, done.
From https://github.com/peacelovea/gitdemo
* branch master -> FETCH_HEAD
1572ab3..e61407f master -> gitdemo/master
Updating 1572ab3..e61407f
Fast-forward
hello.txt | 1 +
1 file changed, 1 insertion(+)
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ git status
On branch master
nothing to commit, working tree clean
# 和Github代码一致
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ cat hello.txt
hello Git!22222
hot fix
master test
hot fix test
hot-fix
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!
hello Git!
Edit from Github first commit
基本语法:git clone 远程地址
创建一个新文件夹
注意:在gitClone目录打开Bash命令
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitClone
$ git clone https://github.com/peacelovea/gitdemo.git
Cloning 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 0
Receiving objects: 100% (21/21), done.
Resolving deltas: 100% (6/6), done.
#进入到gitdemo
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitClone
$ cd gitdemo
#查看别名
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitClone/gitdemo (master)
$ git remote -v
origin https://github.com/peacelovea/gitdemo.git (fetch)
origin https://github.com/peacelovea/gitdemo.git (push)
克隆成功
clone 会做如下操作:
一、选择邀请团队成员。(在仓库设置里操作)
二、填入成员账号,将成员添加到仓库。
三、复制邀请函(链接)发送给成员 ,如:https://github.com/atguiguyueyue/git-shTest/invitations。
四、成员登陆账号在github,在浏览器复制链接,点击接受邀请。
五、成员邀请成功之后,可以在Github账号上看到将来共同开发远程仓库。
六、目标合作者可以修改内容并 push 到远程仓库。
# 编辑 clone 下来的文件
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/pro-linghuchong/git-shTest(master)
$ vim hello.txt
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/pro-linghuchong/git-shTest(master)
$ cat hello.txt
hello git! hello atguigu! 2222222222222
hello git! hello atguigu! 33333333333333
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!
hello git! hello atguigu! master test
hello 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 commit
1 file changed, 1 insertion(+), 1 deletion(-)
# 将本地库的内容 push 到远程仓库
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/pro-linghuchong/git-shTest
(master)
$ git push origin master
Logon failed, use ctrl+c to cancel basic credential prompt.
Username for 'https://github.com': atguigulinghuchong
Counting objects: 3, done.
Delta compression using up to 12 threads.
Compressing 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 https://github.com/atguiguyueyue/git-shTest.git
7cb4d02..5dabe6b master -> master
七.回到发送合作邀请者的 GitHub 远程仓库中可以看到,最后一次是目标合作者提交的。
一、将远程仓库的地址复制发给邀请跨团队协作的人,比如东方不败。
或者直接搜索项目名称
二、在东方不败的 GitHub 账号里的地址栏复制收到的链接,然后点击 网页右上方的Fork按钮,将项目叉到自己的本地仓库
叉成功后可以看到当前仓库信息。
三、东方不败就可以在线编辑叉取过来的文件。
四、编辑完毕后,填写描述信息并点击左下角绿色按钮提交。
五、接下来点击上方的 Pull 请求,并创建一个新的请求。
六、回到岳岳 GitHub 账号可以看到有一个 Pull request 请求。
进入到聊天室,可以讨论代码相关内容。
七、如果代码没有问题,可以点击 Merge pull reque 合并代码。
远程仓库中还有一个 SSH 的地址,因此我们也可以使用 SSH 进行访问。
这里提示没有ssh密钥
先到用户的主页目录,删除.ssh文件夹(如果没有.ssh文件夹,忽略此步)
打开Git Bash,运行命令ssh-keygen生成.ssh目录 敲三次回车:
erhang@DESKTOP-PNIJAHF MINGW64 ~
$ ssh-keygen -t rsa -C 903923381.com
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_rsa
Your public key has been saved in /c/Users/erhang/.ssh/id_rsa.pub
The 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]-----+
查看公钥
erhang@DESKTOP-PNIJAHF MINGW64 ~
$ cd .ssh
erhang@DESKTOP-PNIJAHF MINGW64 ~/.ssh
$ cat id_rsa.pub
ssh-rsa .............
将生成的公钥添加至Github账号SSH设置
打开setting/SSH and GPG keys
添加成功
添加公钥后,可不用输入Github账号密码便可推送。
接下来通过SSH方式提交hello.txt。
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ cat hello.txt
hello Git!22222
hot fix
master test
hot fix test
hot-fix
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!
hello Git!
Edit from Github first commit
#修改本地仓
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ vim hello.txt
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 status
On branch master
Changes to be committed:
(use "git restore --staged ..." to unstage)
modified: hello.txt
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ git commit -m "ssh test"
[master 81efd31] ssh test
1 file changed, 1 insertion(+)
# 通过SSH推送
erhang@DESKTOP-PNIJAHF MINGW64 /d/tool/Git/GitSpace/gitdemo (master)
$ git push [email protected]:peacelovea/gitdemo.git
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing 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 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To github.com:peacelovea/gitdemo.git
e61407f..81efd31 master -> master
推送成功。
环境准备
为什么忽略:
一般我们只希望保存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 http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
.classpath
.project
.settings
target
.idea
*.iml
将文件模板复制到git.ignore后
在.gitconfig 文件中引用忽略配置文件(此文件也在 Windows 的家目录中)
[user]
name = syb
email = [email protected]
[core]
excludesfile = C:/Users/erhang/git.ignore
注意:这里要使用“正斜线(/)”,不要使用“反斜线(\)”
打开设置
选中bin/git.exe
点击导航栏VCS,选择create git repository
选中项目的根目录(默认就选中了),点击ok
可以看到项目根目录出现了.git文件
同时项目颜色变成了红色(git红色表示文件未被追踪,即文件还没被添加到暂存区)
这里我创建一个名叫HelloGit的Maven工程。重复3的操作
创建一个HelloGit类,将其添加Git暂存区。
创建完类后idea会自动提醒是否添加暂存区。
点击add,该类变绿色(绿色说明添加到了暂存区,还没有添加到本地库)
也可以右键单击文件,Git->add,手动添加
也可以将这整个项目一次性add,右键单击文件根目录,手动add
右键单击项目根目录,选择Git->Commit Directory。
添加成功,控制待打印信息
被提交的类变为正常的黑色
修改一行代码
此时被修改的文件变蓝,蓝色说明被追踪过但是又被修改了
我们要重新add,commit,可以看到代码的不同
再添加第三个版本,
因为已经被被追踪过,这里我们可以直接commit
此时有三个版本了
切换版本:
右键选择要切换的版本,然后在菜单里点击 Checkout Revision。
此时头指针指向第二版本,文件也变为第二版本的文件
右键点击HelloGit,Git -> Branches,或者点击IDEA的右下角,点击New Branche:
或:
弹出框,输入分支名:
点击右下角分支选择checkout,可以切换分支
或者在log窗口,右键点击分支,选择checkout:
在hot-fix分支修改类并commit提交:
切换到master分支
我们要将hot-fix分支合并到master分支:
点击右下角master,选择hot-fix分支,选择Merge into Current
如果代码没有冲突, 分支直接合并成功,分支合并成功以后,代码自动提交,无需手动提交本地库。
分别在master,hot-fix分支修改HelloGit类同一行,并提交,故意制作冲突:
此时两分支代码是一样的,我们切换到hot-fix分支,修改一行代码
提交,
提交成功后,切换到master分支,修改同样位置代码
提交
这里我不小心创建了两个
在master分支上合并hot-fix分支
点击Merge into Current,弹出冲突框,点击Merge手动合并
点击apply,合并成功,自动提交本地库
查看日志信息,可以看到hot-fix-commit-2和master commit-2合并成了一个版本
在菜单栏File->Setting->搜索栏搜GitHub,添加GitHub账号:
弹出网页,授权即可
在github主页可以看到项目
点击History可以看到本地库对应的版本
注意: push 是将本地库代码推送到远程库,如果本地库代码跟远程库代码版本不一致,
push 的操作是会被拒绝的。也就是说, 要想 push 成功,一定要保证本地库的版本要比远程库的版本高! 因此一个成熟的程序员在动手改本地代码之前,一定会先检查下远程库跟本地代码的区别!如果本地的代码版本已经落后,切记要先 pull 拉取一下远程库的代码,将本地代码更新到最新以后,然后再修改,提交,推送!
在app类中新增一行代码push test并提交到本地库
push成功
在远程库可以看到新增代码
如果由于网络问题,无法push,我们之前设置过ssh免密登录,也可以用ssh方式push
在远程库HelloGit中,复制ssh链接
app类新增代码并提交到本地库
点击push,选择ssh push commit,点击push
push成功
注意:如果你开的有,https很快就能push,但是ssh会因为网络代理的问题push失败,ssh方式push时把关掉
我们在远程库即github主页对代码进行更新,并提交
此时远程库的代码已经比本地库的代码更新了
注意: pull 是拉取远端仓库代码到本地,如果远程库代码和本地库代码不一致,会自动
合并,如果自动合并失败,还会涉及到手动解决冲突的问题,所以在pull时尽量不要改写本地库的代码。
右键点击项目,可以将远程仓库的内容 pull 到本地仓库:
拉取成功
注意:我这里pull fail了好几次,原因是开启了 关掉即可
我们已经把代码托管到了github上,本地的代码相当于一个备份,这里我直接删除HelloGit项目,利用clone 将代码重新克隆到本地
1.删除项目
2.重新打开idea
在GitHub主页上复制HelloGit项目的链接,我这里复制的是ssh链接
Clone成功后,项目从远程库重新克隆到了本地
GitHub 服务器在国外, 使用 GitHub 作为项目托管网站,如果网速不好的话,严重影响使用体验,甚至会出现登录不上的情况。针对这个情况, 大家也可以使用国内的项目托管网站-码云。使用方式跟 GitHub 一样,而且它还是一个中文网站,如果你英文不是很好,它是最好的选择。
官网:https://gitee.com
…
跟Github的类似。点击+号->新建仓库
也可以从GitHub与GitLab中导入仓库。
创建成功
首先,要在IDEA安装Gitee插件。
在菜单栏选File->Settings->Plugins,搜Gitee。
安装插件成功后,重启IDEA。
功能跟在IDEA的Github插件,功能类似,如添加Gitee账号等,可参考IDEA的Github插件。
连接码云,和之前类似:
可以将本地项目发布到码云上
如果不想点这个,也可以用push推送到码云仓库
打开码云主页,可以看到项目成功被push到远程仓
演示一下完整过程:
本地库新增一行代码
提交
选择码云的链接push
在gitee上修改项目,并提交
选pull按钮,这里要选择码云的路径,不要pull错了
pull成功
1.关闭idea,将项目删除
2.重新打开idea
选择gitee的项目
clone成功
Gitee可以把GitHub的项目迁移到Gitee上,迁移后可以进行同步刷新,不再赘述