一、简介
(一)概述
Git 是分布式版本控制系统(DVCS)。它可以跟踪文件的更改,并允许你恢复到任何特定版本的更改。
与 SVN 等其他版本控制系统(VCS)相比,其分布式架构具有许多优势,一个主要优点是它不 依赖于中央服务器来存储项目文件的所有版本。
每个开发人员都可以“克隆”我在图中用“Local repository”标注的存储库的副本,并且在他的硬盘驱动器上具有项目的完整历史记录,因此当服务器中断时,你需要的所有恢复数据都在你队友的本地 Git 存储库中。
还有一个中央云存储库,开发人员可以向其提交更改,并与其他团队成员进行共享,如图所示,所有协作者都在提交更改“远程存储库”。
(二)Git 与 SVN
Git | SVN |
---|---|
1. Git是一个分布式的版本控制工具 | 1. SVN 是集中版本控制工具 |
2.它属于第3代版本控制工具 | 2.它属于第2代版本控制工具 |
3.客户端可以在其本地系统上克隆整个存储库 | 3.版本历史记录存储在服务器端存储库中 |
4.即使离线也可以提交 | 4.只允许在线提交 |
5.Push/pull 操作更快 | 5.Push/pull 操作较慢 |
6.工程可以用 commit 自动共享 | 6.没有任何东西自动共享 |
(三)Git 安装
去 官网 下载一路 next -> finish 就行了。
安装完成后打开 Git Bash 可以通过命令 (其实就是 Linux 的命令)来设置有关信息,比如说用户名、邮箱等基本信息。
git config --global user.name "Arc"
git config --global user.email "Arc"
#查看信息
git config --list
二、Git 工作流程和术语
(一)工作流程
一般工作流程如下: |
---|
1、克隆 Git 资源作为工作目录。 |
2、在克隆的资源上添加或修改文件。 |
3、如果其他人修改了,你可以更新资源。 |
4、在提交前查看修改。 |
5、提交修改。 |
6、在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。 |
(二)工作区、暂存区和版本库
工作区:就是你在电脑里能看到的目录。
暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage, index),标记为 "master" 的是 master 所代表的目录树。
图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。
当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
当执行 "git reset HEAD" 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
当执行 "git rm --cached file" 命令时,会直接从暂存区删除文件,工作区则不做出改变。
当执行 "git checkout ." 或者 "git checkout -- file" 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
当执行 "git checkout HEAD ." 或者 "git checkout HEAD file" 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
三、Git 仓库管理
(一)本地仓库提交
我们可以使用 git init 初始化一个本地 git 仓库。
本地开发需要将自己写的代码提交到自己本地的暂存区(git add),然后再将暂存区中的文件提交到本地版本库(git commit),之后才能提交到公司的版本库中。
在工作区创建 A.java;
通过 git add "文件" 将文件添加到暂存区;
通过 git commit -m "日志参数" 将暂存区的文件放到版本库中。
和在 Linux 中一样,可以通过 vim 指令查看和修改版本库文件的内容。i 进入编辑模式,ZZ 或者 :wq 保存退出。
通过 git diff "文件" 就可以查看新增内容。
三、Git 基本操作
(一)Git 基本命令
1、git clone
使用 git clone repo directory,就可以将 gitee 或者 github 上的项目克隆到本地,当然你如果直接用的话可以直接 Download Zip,但是通过 git clone 命令就可以将所有的分支下载到本地进行开发。
2、git add
git add 命令可将该文件添加到暂存区。
3、git diff
git diff 命令显示已写入缓存与已修改但尚未写入缓存的改动的区别。
4、git commit
使用 git add 命令将想要快照的内容写入缓存区,而执行 git commit 将缓存区内容添加到仓库中。如果你觉得 git add 提交缓存的流程太过繁琐,Git 也允许你用 -a 选项跳过这一步。
5、git rm
git rm 指令可以删除提交到 版本库 中的文件。
如果只是想简单从工作目录手动删除文件,运行 git status 时就会在 Changes not staged for commit 提示,在这里同 Linux 一样使用 rm 即可删除文件,说句废话就是直接删除。
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除,然后提交。可以用以下命令完成此项工作 git rm file。
⏬使用 git rm 删除没有 add 到缓存区中的文件,fatal。
Arc@Arc MINGW64 ~/Desktop/Git (master)
$ git rm C.txt
fatal: pathspec 'C.txt' did not match any files
⏬将 C.txt add 到暂存区中,使用 git rm 删除,error。
Arc@Arc MINGW64 ~/Desktop/Git (master)
$ git add C.txt
Arc@Arc MINGW64 ~/Desktop/Git (master)
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: C.txt
Arc@Arc MINGW64 ~/Desktop/Git (master)
$ git rm C.txt
error: the following file has changes staged in the index:
C.txt
(use --cached to keep the file, or -f to force removal)
⏬将 C.txt commit 到本地版本库中,使用 git rm 删除,可以看到本地的 C.txt 也跟着没了,git status 可以看到删除 C 确实被记录了。
Arc@Arc MINGW64 ~/Desktop/Git (master)
$ git commit C.txt -m "commit C"
[master 1e2edb9] commit C
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 C.txt
Arc@Arc MINGW64 ~/Desktop/Git (master)
$ git status
On branch master
nothing to commit, working tree clean
Arc@Arc MINGW64 ~/Desktop/Git (master)
$ git rm C.txt
rm 'C.txt'
Arc@Arc MINGW64 ~/Desktop/Git (master)
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
deleted: C.txt
6、git mv
典中典的 移动 和 重命名 操作,相信用过 Linux 的应该很熟悉
由于只是修改了文件,并没有新增文件,所以直接 git commit 就可以了。
Arc@Arc MINGW64 ~/Desktop/Git (master)
$ git mv A.txt AA.txt
Arc@Arc MINGW64 ~/Desktop/Git (master)
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: A.txt -> AA.txt
deleted: C.txt
Arc@Arc MINGW64 ~/Desktop/Git (master)
$ git commit -m "change file name"
[master 092f8b8] change file name
2 files changed, 0 insertions(+), 0 deletions(-)
rename A.txt => AA.txt (100%)
delete mode 100644 C.txt
Arc@Arc MINGW64 ~/Desktop/Git (master)
$ git status
On branch master
nothing to commit, working tree clean
Arc@Arc MINGW64 ~/Desktop/Git (master)
$ git mv AA.txt tempSpace
Arc@Arc MINGW64 ~/Desktop/Git (master)
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: AA.txt -> tempSpace/AA.txt
Arc@Arc MINGW64 ~/Desktop/Git (master)
$ git commit -m "remove AA to tempSpace"
[master ac1a05a] remove AA to tempSpace
1 file changed, 0 insertions(+), 0 deletions(-)
rename AA.txt => tempSpace/AA.txt (100%)
7、git log
使用 git log 查看所有的操作记录
使用 git log --oneline 可以查看更简洁的日志
(二)回滚
通过 git reset [--soft | --mixed | --hard] [HEAD] 进行回滚
–mixed为默认的,可以不用带该参数
–soft用于回退到某个版本
–hard 参数撤销工作区中所有未提交的修改内容
回到和之前一样的效果。
Arc@Arc MINGW64 ~/Desktop/Git (master)
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
deleted: A.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
tempSpace/
四、git 可视化
可以使用 王八Git 或者 SourceTree ,实在不想去官网可以下载我分享的百度云:链接 ,使用 王八git 一路 next 就可以了,官网还有官方给的汉化包。
在变更 A.txt 的内容后可以直接通过 TorGit 进行提交;
双击选中的文件就能比较和之前相比修改了哪里。
同样也可以使用 TorGit 来查看日志和回滚。
五、在 Idea 中配置 Git
File -> Settings -> 版本控制,找到 Git 那一栏选择 git.exe 的文件路径,点击测试,能够显示出 Git 的版本就说明配置成功了,点击应用就算配置完成了。
创建一个 mvn 工程并且将其初始化为一个仓库
回到项目中你就会发现出现了一个新的功能栏;
我们随便新建一个 java 类,这时候 idea可能会提示我们提交,不用管他。
写完之后可以选择打开终端输入 git 指令进行 add 、commit 操作;
如果你嫌麻烦的话直接点击这边的 commit (在 idea 中他会自动 add),选择想要上传到版本库中的文件,写好日志,点击提交即可。
can can 日志如下:
如果修改了某些东西 Idea 也会检测到,并会在页面内展示两个版本的内容。
直接在控制台看日志,这不比王八 Git 好用?
六、Git 的分支
在 git 中,分支指的是从主线上分离出来进行另外的操作,既不影响主线,主线又可以继续干它的事,它可用来解决临时需求;当分支做完事后可合并到主线上,而分支的任务完成可以删掉了。
比如说一个项目交给 A、B、C 三人进行三个模块的新功能开发,肯定不能从原来的代码上改动,势必要分出一条分支来作为自己的开发内容,三人都开发完成后将三个分支合并,就得到了最终的开发结果。
(一)创建分支
通过 git branch [name] 命令或者 王八Git 等可视化工具都可创建新的分支,使用 git checkout 切换分支;或者直接使用 git checkout -b [name] 完成分支的创建和切换。
在 dev 分支的基础上新建一个 AAA.txt 并提交。
返回 master 分支发现 AAA.txt 消失了,再次切换回 dev 分支 AAA.txt 就会出现。
(二)合并分支
在创建分支 dev 之前,master 中就有 .idea、.src、pom.xml 文件,所以当从 master 上复制出来 dev 分支,这些文件依然保留,如果对于 dev 分支已经开发完成(项目组的所有分支已经完成),可以合并到主分支让所有的开发者能看见完整的项目。
使用 git merge [name] 将分支合并回当前分支,可见 dev 分支下的 AAA.txt 也出现在了 master 分支。
此时 HEAD 指向 master 分支,在日志中也可见 master 和 dev 进行了一次合并。
(三)删除分支
在上边使用 git merge 合并分支后我们发现只是 HEAD 指向了当前分支(即执行 merge 命令的分支),但是 dev 分支然然存在,使用 git branch -d [name] 即可彻底移除分支。
(四)分支冲突
合并分支时,两个分支在同一文件的同一位置有着不同的修改,这时git无法替代我们保留哪一个,需要我们手动介入修改。
graph LR 1[Master include A.txt] --A.txt--> 2[dev1 change A second line] -->4[Master] 1[Master include A.txt] --A.txt--> 3[dev2 change A second line] -->4[Master] 如上图,master 中有个 A.txt 文件,分支 dev1 和分支 dev2 都对 A 的第二行进行了修改,那么在合并的时候就会产生冲突。
#文件 A.txt 已经在 master 分支中 commit
#将 dev1 分支合并到 master
Arc@Arc MINGW64 /d/MyCodeWorkSpace/GitTest (master)
$ git merge dev1
Updating ad9269c..19c1b22
Fast-forward
A.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
#将 dev2 分支合并到 master
Arc@Arc MINGW64 /d/MyCodeWorkSpace/GitTest (master)
$ git merge dev2
Auto-merging A.txt
CONFLICT (content): Merge conflict in A.txt
Automatic merge failed; fix conflicts and then commit the result.
很明显这种操作会引发冲突,在 master 分支的 A.txt 文件内容会变成下面这样,master 分支的状态也显示合并中,并且红字标出信息表示两个分支都对 A.txt 进行了更改。
当 git 不能自动合并分支内容时,就需要手动合并两个分支中的内容,这样就相当于两个人都对 A 做了修改,但是需要比较一下这两个人写的代码的区别,所以 dev1 和 dev2 做出的修改我们都保存。
Arc@Arc MINGW64 /d/MyCodeWorkSpace/GitTest (master)
$ git log --oneline
d109cbe (HEAD -> master) 解决了dev1和dev2的冲突
e3d7a2a (dev2) commit A in dev2
19c1b22 (dev1) commit A in dev1
ad9269c master commit A
fff6198 on dev commit
a761ec1 添加了一个工具包依赖项
9375007 添加了一个叫Use的类
七、在 IDEA 中操作分支
新建的项目可以在 VCS 中初始化仓库,不需要 git init即可。
(一)新建分支
在右下角显示当前分支,可以在这里新建分支;
(二)Merge 和 rollback
签出(checkout)到 master 在 git 选项卡中就可以合并别的分支;
在左下角的 git 选项中可以看到提交日志,并可以进行回滚等操作。
User 没辣。
八、远程仓库
这里使用的是 码云,在 gitee 中新建一个空的仓库克隆到本地,为了省时间我直接把 src 和 pom 复制到本地了;
回到 IDEA 中打开刚才 clone 的项目,在点击右上角的中间绿色对号到提交页面(可能 IDEA 版本不同出现的不一样,我的一开始也是悬浮的,上面有个切换到新界面的提示);
提交就是我们熟悉的 提交到本地仓库,提交并推送就可以把更改 push 到远程仓库了。
在 Gitee 的设置中可以选择公开来让大家一起编辑;
对于做出的修改,在 IDEA 中也能通过拉取的形式同步到本地仓库。
标签:Git,git,入门,Arc,master,使用,txt,分支 From: https://www.cnblogs.com/purearc/p/17429529.html