git 仓库初始化
git init 仓库名
配置邮箱和作者信息
git config --global user.email "zhang @zhang.mba" git config --global user.name "zhang"
添加
git add 文件名 或 ./*
提交
git commit -m "提交说明注释"
查看状态
git status
查看日志
git log //只显示提交的注释 git log --oneline git log --graph --oneline --all --decorate
回滚文件
git checkout -- ./
先在服务器上建一个远程仓库test1,将本地提交
git remote add origin http://git.zhang.mba/zhangzhiqi/test1.git git push -u origin master
从Git服务器上拉取仓库到本地
git clone http://git.zhang.mba/zhangzhiqi/test1.git
图形化的方式查看git的分支信息,以及文件提交信息。
gitk --all
创建新分支
git branch 分支名
切换到新分支
git checkout 分支名
创建并切换到新分支
git checkout -b 新分支
查看当前在哪个分支(带*号的),或查看所有的分支:
git branch
合并分支
git merge 被合并的分支
从Git服务器拉取分支代码
git pull
推送分支代码到Git服务器
git push git push origin master //master 可以换成任何想要推送的分支
删除分支
git branch -D 分支名
其他Git知识:
Git基础
git [git] 是一个分布式的版本控制系统。官方网站地址:https://git-scm.com/

一. 简介
Linux操作系统有着众多的开发者共同参与开发。一开始该项目使用Bitkeeper来管理和维护代码,2005年的时候,Bitkeeper不再免费使用,这就迫使着Linux开源社区开发一套自己的版本控制系统。
自2005年诞生以来,Git日臻完善,它的速度飞快,特别适合大型项目的开发,还有着令人难以执行的非线性分支管理系统,可以应对各种复杂的项目的开发。
1.1 Git的工作模式
我们自己的计算机从版本服务器同步代码,日常开发的过程中90%以上的操作都是在本地计算机,在本地操作完成后需要推送到远程服务器。

1.2 Git的三种工作状态
已修改(modified)
已暂存(staged)
已提交(commited)

1.3 本地库与服务器库

二. Git的基本命令
git init : 初始化仓库(需要记)
git status : 查看工作空间的状态(需要记)
git add a.txt : 将已修改的文件纳入到暂存区。(需要记)
git add -A : 将所有的已修改的文件纳入到暂存区 (不用记)
git add -h : 查看git add 所有的参数 (需要记)
git rm --cached a.txt : 将a.txt从暂存区移除,首次初始化提交的时候才会使用到(不用记)
git commit -m 'first comit' : 将暂存区的内容提交到本地版本库 (需要记)
git log : 查看提交历史信息 (需要记)
git log -3 : 查看最近3条提交信息(需要记)
git log --oneline : 将提交日志信息按行显示。(不用记)
git log --pretty=format:"%h - %an, %ar : %s" : 按照指定的格式输出。(不用记)
git checkout -- a.txt : 撤销删除或者更新文件 (不用记)
git reset HEAD a.txt : 将已追踪的文件从暂存区移除。(不用记)
git commit --amend -m 'new msg' : 修正提交信息。 (需要记)
git commit -am 'msg' : 将git add 与 git commit两条命令进行合并(需要记)
git log --graph --oneline : 查看日志的简单图形化信息(需要记)
三. 修改用户信息
在提交信息的时候回提示设置用户名和邮件,设置该信息可以在两个地方进行设置:
C:\Users\Administrator\.gitconfig 全局设置
.git\config 局部设置,不同的项目情况下使用
设置全局的信息使用如下命令:
git config --global user.email "zou@qq.com"
git config --global user.name "miller"
设置局部信息使用如下命令:
git config --local user.email "zou@qq.com"
git config --local user.name "miller"
四. git rm与rm的区别
使用 rm 命令删除文件,如下:

使用 git rm 删除文件,如下:

rm是操作系统级别的命令,只是将文件从工作区移除, 被删除的文件并没有纳入到暂存区;而git rm命令实际上是由两个命令(rm和git add)合成的,git rm删除了工作区的文件,并将删除的文件纳入到暂存区。
当使用rm命令删除文件的时候,只需要通过 git checkout a.txt 即可撤销删除;而通过git rm命令删除文件,需要通过两个命令撤销修改,这两个命令一次为 git reset HEAD 和 git checkout file.
五. .gitignore
在Git中,有些文件或者文件夹并不需要纳入到版本控制系统,例如maven编译后的target目录,ide的配置文件,所以Git提供了一个非常优秀的解决方案,就是.gitignore。需要在Git的版本库中创建一个名为.gitignore的文件,文件的语法如下:
settings.xml #将同级目录下的settings.xml文件忽略
/target #忽略/target目录以及所有的子目录和文件
/*/test #忽略掉/abc/test /def/test,但是不能忽略掉/a/b/test
/*/*.iml #忽略掉/abc/a.iml /def/bcd.iml,但是不能忽略掉/a/b/cde.iml
/*.java #忽略掉User.java, 但是不能忽略/com/Person.java
/debug/*.java #忽略掉/debug/A.java, 但是不能忽略掉/debug/a/C.java
*.log #忽略掉所有的以log结尾的文件
bin/ #会忽略bin目录以及所有的子目录,但如果bin是文件则不忽略
六. 分支
git branch : 查看所有的分支,以及当前所处的分支
git branch testing : 创建testing分支
git branch testing d7e347 : 创建一个分支指向d7e347这个提交。
git checkout testing : 切换到testing分支
git checkout -b parent : 创建parent分支,并切换到parent分支
git branch -d parent : 删除parent分支
git merge testing : 将testing分支合并到当前分支。
gitk --all : 图形化的方式查看git的分支信息,以及对文件提交信息。
git log --graph --oneline --all : 图形化的方式展示分支信息。
git branch -m testing testing1 : 将testing分支的名字改为testing1.

6.1 Git提交的原理
Git每次在提交的时候,会生成一个提交对象,那么这个新生成的提交对象有一个指针,该指针会指向上一次的提交对象,如下图所示:

6.2 分支的原理
Git 的分支,其实本质上仅仅是指向提交对象的可变指针。 Git 的默认分支名字是 master。 在多次提交操作之后,你其实已经有一个指向最后那个提交对象的 master 分支。 它会在每次的提交操作中自动向前移动。Git 的 master 分支并不是一个特殊分支。 它就跟其它分支完全没有区别。 之所以几乎每一个仓库都有 master 分支,是因为 git init 命令默认创建它,并且大多数人都懒得去改动它。
如下图所示,master分支执行f30ab这个提交,而HEAD指向了master,意思是当前用户所处的分支是master.

HEAD其实就是一个指针,指向的是当前用户所处的分支,可以在.git这个目录下的HEAD文件中查看到信息。
A. 使用 git branch testing 这个命令会创建一个testing分支,此时testing分支和master分支指向的是同一个提交,如下图所示:


B. 当使用git checkout testing 这个命令,会切换到testing这个分支,此时HEAD会指向testing,如下图:

C. 当在testing这个分支,编辑某个文件并提交。此时testing这个分支执行的是最新的提交,而master还是指向上次一的提交,如下图:

D. 再次切换到master这个分支,编辑某个文件并提交。此时master指向的是另外一个提交,如下图:

E. 此时用 git log --all --graph 看到的结果如下图所示:

6.3 分支的合并
在master分支执行 git merge testing 命令会出现冲突,如下图:

冲突的原因是因为,有master和testing这两个分支最新的提交的上一次提交指向同一个提交,这种情况可能会导致冲突,该冲突需要手动的修改文件,此时文件内容如下图:

修改文件的内容后,执行 git add a.txt 和 git commit -m 'merge completed' 即可完成合并。

此时分支的形式如下:

七. 版本的回退
git reset --hard HEAD^ : 回到上一个版本。
git reset --hard HEAD^^: 回到上两个版本。
git reset --hard HEAD~5: 回到上5个版本。
git reset --hard f1f52: 回到一个固定的版本, f1f52为commit_id的前几位,只要能够保证唯一性就可以。
查看所有的操作日志命令: git reflog
八. 保存工作现场
当我们正在某个分支上工作的时候,而功能并没有完善,又或者代码没有编写完成,此时也不能提交。而被领导要求在其他分支上进行操作,在其他分支上也可以看到修改状态,可能造成在其他分支上误操作导致提交。这个时候就需要用到工作现场。
git stash: 保存工作现场。
git stash list: 查看所有的工作现场。
git stash pop: 弹出工作现场,并将工作现场从stash中删除。
git stash apply: stash中的内容并不会删除,需要通过 stash drop stash@{0} 删除工作现场。
git stash apply stash@{0}: 直接开始运用指定的工作现场。
九. 标签与diff
9.1 标签
标签的作用是当项目发布一个里程碑的时候,给其一个做个标记,往往用来指定版本。标签的命令如下:
git tag v1.0: 创建一个V1.0的标签。
git tag: 查看所有的标签
git tag -d v1.0: 删除v1.0这个标签
9.2 diff
diff命令是源于linux操作系统中的命令,用于查看两个文件中的区别,git也提供了该功能,命令如下:
git diff: 查看暂存区与工作区的文件的区别
git diff HEAD: 查看版本库最新一次提交的与工作区间的差异
git diff ba8dc34c: 查看指定提交与工作区间的差异
git diff --cached: 查看版本库与暂存区间文件的差异
其他命令
git checkout 79af3: 切换到79af3这个提交点。
git blame a.txt: 追踪a.txt这个文件的提交信息。
命令的区别:
git checkout dev : 切换分支。
git checkout -- a.txt: 丢弃掉工作目录中相对于上一次添加到暂存区的修改。
git add a.txt: A. 将a.txt文件纳入到暂存区;B. 当合并操作的时候,表示已经合并完成。
pc@BDT-001 MINGW64 /d/gitLearn $ git status fatal: not a git repository (or any of the parent directories): .git pc@BDT-001 MINGW64 /d/gitLearn $ ll total 0 drwxr-xr-x 1 pc 197121 0 May 16 09:28 zhang/ pc@BDT-001 MINGW64 /d/gitLearn $ cd zhang pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ ll total 4 -rw-r--r-- 1 pc 197121 641 May 16 09:28 dfsdfee -rw-r--r-- 1 pc 197121 116 May 16 09:19 index.html -rw-r--r-- 1 pc 197121 4 May 16 09:15 three.html -rw-r--r-- 1 pc 197121 4 May 16 09:15 two.html pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ git status On branch master Untracked files: (use "git add <file>..." to include in what will be committed) dfsdfee nothing added to commit but untracked files present (use "git add" to track) pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ rm dfsdfee pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ git status On branch master nothing to commit, working tree clean pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ git log commit 394c942e4fc1fd80a296fb0efe58f13b22bd4bd3 (HEAD -> master) Author: unknown <zhang@zhang.mba> Date: Mon May 16 09:27:01 2022 +0800 five commit commit 7bebf157efe6df2e358131a331429a187c6f52b1 Author: unknown <zhang@zhang.mba> Date: Mon May 16 09:18:57 2022 +0800 four commit 35bde27985f14fa322916bf631492682b1ad2449 Author: unknown <zhang@zhang.mba> Date: Mon May 16 08:58:14 2022 +0800 git two commit commit 16dc50a9c736c7110c54c37685b6fb046eca30c4 Author: unknown <zhang@zhang.mba> Date: Mon May 16 08:57:22 2022 +0800 git first commit pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ ll total 3 -rw-r--r-- 1 pc 197121 116 May 16 09:19 index.html -rw-r--r-- 1 pc 197121 4 May 16 09:15 three.html -rw-r--r-- 1 pc 197121 4 May 16 09:15 two.html pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ vim ini.txt pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ vim class.txt pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ vim h.txt pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ vim q.txt pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ git add ini.txt fatal: pathspec 'ini.txt' did not match any files pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ ll total 3 -rw-r--r-- 1 pc 197121 116 May 16 09:19 index.html -rw-r--r-- 1 pc 197121 4 May 16 09:15 three.html -rw-r--r-- 1 pc 197121 4 May 16 09:15 two.html pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ vim ini.txt pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ vim class.txt pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ vim h.txt pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ vim q.txt pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ ll total 7 -rw-r--r-- 1 pc 197121 7 May 16 09:32 class.txt -rw-r--r-- 1 pc 197121 8 May 16 09:33 h.txt -rw-r--r-- 1 pc 197121 116 May 16 09:19 index.html -rw-r--r-- 1 pc 197121 5 May 16 09:32 ini.txt -rw-r--r-- 1 pc 197121 3 May 16 09:33 q.txt -rw-r--r-- 1 pc 197121 4 May 16 09:15 three.html -rw-r--r-- 1 pc 197121 4 May 16 09:15 two.html pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ git add ini.txt warning: LF will be replaced by CRLF in ini.txt. The file will have its original line endings in your working directory pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ git commit -m "项目初始化了" [master 368cc1e] 项目初始化了 1 file changed, 1 insertion(+) create mode 100644 ini.txt pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ git add class.txt warning: LF will be replaced by CRLF in class.txt. The file will have its original line endings in your working directory pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ git commit -m "类全部初始化了!" [master fda7a9a] 类全部初始化了! 1 file changed, 1 insertion(+) create mode 100644 class.txt pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ git add h.txt warning: LF will be replaced by CRLF in h.txt. The file will have its original line endings in your working directory pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ git commit -m "后台写完了" [master 647aa49] 后台写完了 1 file changed, 1 insertion(+) create mode 100644 h.txt pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ git add q.txt warning: LF will be replaced by CRLF in q.txt. The file will have its original line endings in your working directory pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ git commit -m "前台写完了!!" [master d2ecf32] 前台写完了!! 1 file changed, 1 insertion(+) create mode 100644 q.txt pc@BDT-001 MINGW64 /d/gitLearn/zhang (master) $ git log commit d2ecf321f134fd70b8b60ed36810398c74724e34 (HEAD -> master) Author: unknown <zhang@zhang.mba> Date: Mon May 16 09:35:13 2022 +0800 前台写完了!! commit 647aa49aeb82801c5b5ca81ef92e21489287bb2a Author: unknown <zhang@zhang.mba> Date: Mon May 16 09:34:50 2022 +0800 后台写完了 commit fda7a9a7f2b4a6ebd630957add5042b252f3b255 Author: unknown <zhang@zhang.mba> Date: Mon May 16 09:34:19 2022 +0800 类全部初始化了! commit 368cc1e8571517034cde9a45abf724addfcf9733 Author: unknown <zhang@zhang.mba> Date: Mon May 16 09:33:43 2022 +0800 项目初始化了 commit 394c942e4fc1fd80a296fb0efe58f13b22bd4bd3 Author: unknown <zhang@zhang.mba> Date: Mon May 16 09:27:01 2022 +0800 five commit commit 7bebf157efe6df2e358131a331429a187c6f52b1 Author: unknown <zhang@zhang.mba> Date: Mon May 16 09:18:57 2022 +0800 four commit 35bde27985f14fa322916bf631492682b1ad2449 Author: unknown <zhang@zhang.mba> Date: Mon May 16 08:58:14 2022 +0800 git two commit commit 16dc50a9c736c7110c54c37685b6fb046eca30c4 Author: unknown <zhang@zhang.mba> Date: Mon May 16 08:57:22 2022 +0800 git first commit pc@BDT-001 MINGW64 /d/gitLearn/zhang (master)



