Git小乌龟的安装及使用

 

 

代码里的左侧颜色标识:

 

红色,未加入版本控制; (刚clone到本地)
绿色,已经加入版本控制暂未提交; (新增部分)
蓝色,加入版本控制,已提交,有改动; (修改部分)
白色,加入版本控制,已提交,无改动;
灰色:版本控制已忽略文件。

 

1.先下载git,按照相应的系统,https://git-scm.com/downloads,然后,一直next即可完成安装

2.安装git小乌龟,https://tortoisegit.org/download/,同样的,一直next即可完成安装,但是,需要注意的是必须先安装git,在安装git小乌龟

3.安装语言包,同样是https://tortoisegit.org/download/,然后一直next即可,要先装完小乌龟在安装语言包。

 

右键→tortogit→setting,把language项改为中文,点击确定就可以了

 
 
 
 

 

git pull后如何恢复到原来的版本

 

git安装之后,打开cmd窗口,执行命令:git reflog  命令查看你的历史变更记录

git reset --hard HEAD@{n} (注意:n是你要回退到的引用位置)

  • 找到需要回退的版本,执行命令:git reset --hard HEAD@{n}
  • 如执行:git reset --hard 61a942c

git添加远程仓库地址,并初步提交代码

项目工程右击,选择Git Bash Here,

 

 

 弹出命令输入窗口,也可以直接在 IDEA中,如下图

 

 打开终端

执行以下操作

 

-----初始化仓库

git init

-----关联远程仓库

git remote add origin git@github.com:YotrolZ/helloTest.git        其中git@github.com:YotrolZ/helloTest.git可根据实际需要更改,如git remote add origin http://yinjunguo@172.16.120.158:18888/r/dolphinscheduler-ui.git

git add *或者git add .
git commit —m"初次提交"

 

 

附:查看状态可用 git status

E:\mm\zdh>git push -u origin master------------我们第一次push的时候,

加上-u参数,Git就会把本地的master分支和远程的master分支进行关联起来,
我们以后的push操作就不再需要加上-u参数了
To https://gitee.com/xxx/xxx.git
 ! [rejected]        master -> master (fetch first)
  error: failed to push some refs to           
 'https://gitee.com/xxx/xxx.git'
 hint: Updates were rejected because the remote contains 
 work that you do
 hint: not have locally. This is usually caused by another 
 repository pushing
 hint: to the same ref. You may want to first integrate the 
 remote changes
 hint: (e.g., 'git pull ...') before pushing again-------提示要先拉取
 hint: See the 'Note about fast-forwards' in 'git push --help' for 
 details.

xxxx>git pull origin master

warning: no common commits

remote: Counting objects: 4, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
From https://gitee.com/xxx/xxx
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> origin/master
fatal: refusing to merge unrelated histories 

xxxxx>git push -u origin master-------------------不可以

To https://gitee.com/xxx/xxx.git

! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to     
'https://gitee.com/xxx/xxx.git'
 hint: Updates were rejected because the tip of your current 
 branch is behind--------提示你本地分支的版本落后(更新被拒 
 绝,因为您当前分支的提示落后)
hint: its remote counterpart. Integrate the remote changes 
(e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for 
details.

xxxxx>git push -u -f origin master-----------注 释:-f是强制推送,覆盖远程

Counting objects: 5, done.

Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (5/5), 316 bytes | 0 bytes/s, done.
Total 5 (delta 0), reused 0 (delta 0)
To https://gitee.com/xxx/xxx.git
+ b9d4e84...fb730f5 master -> master (forced update)
Branch master set up to track remote branch master from 
origin.

总计一下操作

本地新建项目,
如果想ignore这个文件:如ignore node_modules这个文件夹不进行初始化和push,按下图操作



 

 

然后初始化仓库git init
关联远程仓库
git remote add origin http://yinjunguo@172.16.120.158:18888/r/dolphinscheduler-ui.git
添加
git add *
提交
git commit —m"初次提交"
拉取
git pull origin master
上传
git push -u -f origin master

 或者

进入文件夹,初始化git
$ git init
添加远程地址:
$ git remote add origin http://yinjunguo@172.16.120.158:18888/r/dolphinscheduler-ui.git
$ git pull --rebase origin master
$ git add .
$ git commit -m "init files"
$ git push -u origin master
 

idea配置git,查看git代码&拉取git项目至本地

 

1、点击file,右键选择setting

 

 

选择本地git安装路径

 

 

 

弹出如下框,并进行信息输入

 

 其中URL根据实际GIT服务器地址填写,Directory填写的值为项目拉取到本地IDEA的路径,点击克隆Clone即可

 

项目已经拉取到本地,然后点击open,打开项目的pom.xml,然后选择作为项目打开即可

项目拉下来后,需要配置maven

所依赖的项目也拉到本地后,发现有很多依赖的jar包找不到,如图所示 此时点击一下 install 安装一下即可

 

git fetch 和 git pull区别

git在本地会保存两个版本的仓库,分为本地仓库和远程仓库。
1、本地仓库就是我们平时 add、commit 的那个仓库。
2、远程仓库可以用git remote -v查看(这里的远程仓库是保存在本地的远程仓库,等同于另一个版本,不是远程的远程仓库)。

说说 fetch 和 pull 的不同:

fetch 只能更新远程仓库的代码为最新的,本地仓库的代码还未被更新,我们需要通过 git merge origin/master 来合并这两个版本,你可以把它理解为合并分支一样的。

pull 操作是将本地仓库和远程仓库(本地的)更新到远程的最新版本。

如果想要更加可控一点的话推荐使用fetch + merge。

 

PUSH之前必须注意之处

1.先提交要更改或者新增的文件,然后占存目的使本地工程代码和远程工程代码一样,占存相当于把本地文件修改的东西剪出来,使本地代码和远程服务端代码一样

 

 

2.pull,从远程拉取最近的代码到本地

 

3.还原占存的代码,

当相于把之前修改和增加的代码剪出来的东西在粘贴在这里,如果PULL以后本地文件(相当于自己修改的代码要占存的同一个文件)有更新的,提交的时后会提示你冲突合并,自己一一解决冲突合并,如果PULL以后本文件更新的地方,不在占存剪出来的同一个地方,直接会自动合并,不存在冲突,此 还原占存的代包含所有不同的文件,和提交部分更改和新增的不一样

 

 

4.提交

5.PUSH或者同步

 

 

 

 GIT版本树分析

在使用 Git 的进行代码版本控制的时候,往往会发现在 log 中出现 "Merge branch 'master' of ..." 这句话,如下图所示。日志中记录的一般为开发过程中对代码的改动信息,如果出现过多例如上述描述的信息会造成日志的污染。

 

 

阅读了一些外文的博客,下面就来一探究竟。

产生原因分析

当多人合作开发一个项目时,本地仓库落后于远程仓库是一个非常正常的事情,可参考下图。

 A-B-C(master)
    \
     D(origin/master)

具体情境如下:

  1. 我当前拉取的远端版本为 B,此时修改了代码,并在本地仓库 commit 一次,但并未 push 到远端仓库。
  2. 另一位开发者在 B 的基础上,同样 commit 了一次并 push 到远端仓库。那么这个时候,我再 push 自己的代码就会发生错误,如下。
To github.com:maoqyhz/usegit.git
! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@github.com:maoqyhz/usegit.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.

这个时候我们会选择,先 pull,再 push。Ok,push 成功,但是此时我们查看 log 就会发现除了我们自己提交的那条日志之外,会多出一条 "Merge branch 'master' of ..."。

那么,为什么会出现这种现象呢?其实是与 Git 的工作原理有关,对 Git 比较了解的人应该会知道,无论是 pullpush 亦或是 merge 操作,其实背后都是有很多的不同的模式的。

在进行 pull 操作的同时,其实就是 fetch+merge 的一个过程。我们从 remote 分支中拉取新的更新,然后再合并到本地分支中去。

  1. 如果 remote 分支超前于本地分支,并且本地分支没有任何 commit 的,直接从 remote 进行 pull 操作,默认会采用 fast-forward 模式,这种模式下,并不会产生合并节点,也就是说不会产生多余的那条 log 信息
  2. 如果想之前那样,本地先 commit 后再去 pull,那么此时,remote 分支和本地会分支会出现分叉,这个时候使用 pull 操作拉取更新时,就会进行分支合并,产生合并节点和 log 信息。这两种状态分别如下图所示:
# fast-forword 
A-B-D(origin/master)
     \
      C'(master)

# merge
A-B-C-E(master)
   \ /
    D(origin/master)

如何避免

为了去除自动生成的 log 信息,有以下几种解决方案:

  1. 如果你使用的是 Git Bash,直接使用 git pull --rebase。如果拉取不产生冲突,会直接 rebase,不会产生分支合并操作,如果有冲突则需要手动 fix 后,自行合并。
  2. 如果使用的是 GUI,例如 TortoiseGit,可以先 fetch,再手动 rebase 就可以了。

关于 rebase 和 merge

关于什么时候使用 rebase,什么时候使用 merge,开发者总结了几条规则:

  • 从 remote 分支拉取更新到本地时,使用 rebase。
  • 当完成 bug 修复或新功能时,使用 merge 将子分支合并到主分支。
  • 没有人应该 rebase 一根共享的分支。

有关这两者具体的操作,可以参考我在文章最后列出的博客。

References