Git基础知识

Git 和 SVN 的区别

git是目前最先进的分布式版本控制系统。
分布式的意思是每一台机器都可以充当中央服务器。
git用很长的一串字符记录版本。

svn是集中式版本控制器,需要联网后才能使用,而且速度慢。
集中式的意思是版本库集中放在中央服务器,各位代码狗需要代码时从中央服务器下载,写完后再次推送到中央服务器。
如果中央服务器出问题可能所有人的工作都不能进行。
svn用数字1记录版本。

Git原理

暂存区:文件夹的的.git文件夹,每次执行git commit后会保存子啊这个文件夹中
工作区:工作区就是本地该代码的那个文件夹及文件,所以每次git checkout后代码总是会自动改变

本地仓库:本地的仓库,即自己电脑上的项目代码
远程仓库:即远程服务器上的代码,虽然git是分布式架构,但在我的理解中,远程仓库就是只github或gitlab这种远程仓库

本地分支:本地切换后的分支
远程分支:远程服务器中分支,其中包括别人创建的分支,可以用git branch -r查看

Git 使用

配置用户信息

第一个要配置的是个人用户名称和电子邮件地址,Git提交时都会引用这两条信息,说明是谁提交了更新,并随更新永久纳入历史记录:
git config --global user.name "tangguoqiang"
git config --global user.email "1639619652@qq.com"

创建版本库

1、创建本地仓库
mkdir -p git_local_dir
cd git_local_dir
#将本地文件夹变成Git可以管理的仓库
git init

2、在GitHub网站创建仓库并下载
在github官网上创建仓库并用git下载
git clone git@github.com:tg10020617/git-test-project.git

查看提交日志

git log
------------------------------
commit 872d8cf44d4b928dae18de00c8cf6024b1253426        ###    版本号
Author: tg10020617 <1639619652@qq.com>                ### 提交人
Date:   Thu Aug 9 18:24:08 2018 +0800                ### 提交日期

    commit 2                                        ### 提交是记录的commit

commit a86c5554597057e50a49282328f394f2bdc5d127
Author: tg10020617 <1639619652@qq.com>
Date:   Thu Aug 9 18:20:43 2018 +0800

    commit 1
------------------------------

跳到之前的版本

(执行这些命令只能会跳到本地库的某个版本,并不更新其他库,只有执行git push后才会更新)
(执行跳转后,如果记得跳转前的版本号,也能回到跳转前的状态)
跳到上个版本        git reset --hard HEAD^
跳到上上个版本    git reset --hard HEAD^^
跳到上100个版本    git reset --hard HEAD~100
------------------
git reset --hard HEAD^
HEAD 现在位于 7d97191 commit 3

# 我记得我commit 4的号的前几位是 cde12f022183 所以也可以跳转到之前的版本
git reset --hard cde12f022183
HEAD 现在位于 cde12f0 commit 4
------------------

一个超级吧吊的命令

git reflog
(用来记录每一次版本跳转或者版本提交的版本号)
--------------------------------
git reflog
#感觉有了这个命令可以随便作死了
cde12f0 HEAD@{0}: reset: moving to cde12f022183
7d97191 HEAD@{1}: reset: moving to HEAD^
cde12f0 HEAD@{2}: commit: commit 4
7d97191 HEAD@{3}: commit: commit 3
872d8cf HEAD@{4}: commit: commit 2
a86c555 HEAD@{5}: commit (initial): commit 1
--------------------------------

git管理的是修改,而不是文件

也就是,当你第一次修改完文件并且将添加进暂存区(git add),再次修改后(不执行git add),然后提交(git commit)
则只提交第一次修改后的文件,第二次修改的不提交。所以便于回滚。
------------------------------
git diff HEAD -- readme.txt
# 比较工作区文件与最后一次提交的文件的区别

diff --git a/readme.txt b/readme.txt
index 6530232..9a7f1b6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -7,3 +7,7 @@ test 3: 08 09 19 56
 test 4: 08 09 20 02

 test 5: 08 09 23 39
+                            有 + 号的这几列是新增加的
+test 6: 08 09 23 41
+
+test 7: 08 09 23 44


git diff HEAD^ -- readme.txt
# 比较工作区文件与上上次提交的文件的区别

diff --git a/readme.txt b/readme.txt
index 1a19da3..9a7f1b6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -5,3 +5,9 @@ test 2: 08 09 18 23
 test 3: 08 09 19 56

 test 4: 08 09 20 02
+                            有 + 号的这几列是新增加的
+test 5: 08 09 23 39
+
+test 6: 08 09 23 41
+
+test 7: 08 09 23 44
------------------------------

删除内容

-----------------------------
git checkout -- readme.txt
# 只是删除工作区的内容,而非暂存区或者提交后的文件,即删除git add之前的文件

git reset HEAD readme.txt
# 恢复到最新状态,即将git add后的文件移除暂存区,移除到工作区再使用上一条命令删除

git rm local_update1.md
git commit -m "rm local_update1.md"
# 删除文件

rm 'local_update1.md'
# 位于分支 master
# 要提交的变更:
#   (使用 "git reset HEAD <file>..." 撤出暂存区)
#
#    删除:      local_update1.md
#
-----------------------------

创建分支

-----------------------------
git branch feature/test1
# 此时只在本地创建了test1分支,远程并没有这个分支,可以用git branch -r查看远程分支
git branch -r

[root@VM_191_181_centos git-test-project]# git branch test1
[root@VM_191_181_centos git-test-project]# git branch
* master
  test1
[root@VM_191_181_centos git-test-project]# git branch -r
  origin/master

# 切换到test1分支
git checkout test1


# 也可以创建并切换到test1分支
git checkout -b feature/test1
-----------------------------

提交分支

-----------------------------
# 合并test1分支到master分支,只是在暂存区中合并,要想在远程分支生效,需要git push
git merge test1

# 合并完成后就可删除分支(这里的删除指的是在删除本地的分支)
git branch -d test

[root@VM_191_181_centos git-test-project]# git branch
* master
  test1
[root@VM_191_181_centos git-test-project]# git branch -d test1
已删除分支 test1(曾为 462144d)。
[root@VM_191_181_centos git-test-project]# git branch
* master
[root@VM_191_181_centos git-test-project]# git branch -r
  origin/master
  origin/test1
[root@VM_191_181_centos git-test-project]#
----------------------------

bug分支

(即可以同时开两个分支,将第一个分支用git stash的形式将文件保存,然后再另一个分支开发,最后再次用git branch跳回重新解决)
----------------------------
git stash

[root@VM_191_181_centos git-test-project]# git add bug.md
[root@VM_191_181_centos git-test-project]# git stash
Saved working directory and index state WIP on feature/bug: 462144d new branch upload document
HEAD 现在位于 462144d new branch upload document
[root@VM_191_181_centos git-test-project]# git stash list
stash@{0}: WIP on feature/bug: 462144d new branch upload document
[root@VM_191_181_centos git-test-project]# git stash pop
# 位于分支 test1
# 尚未暂存以备提交的变更:
#   (使用 "git add <file>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
#    修改:      readme.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
丢弃了 refs/stash@{0} (5edd14408756fbffb7b355b266f0e1618c17c6c8)
----------------------------

不保存本地修改,强制拉取远程

----------------------------
# 下载远程仓库最新版,并且不作合并
git fetch --all
# 将head指针指向test02的最新版
git reset --hard origin/test02
git pull origin test02
----------------------------

比较两个分支/文件的差异

----------------------------
# 查看test1分支有而master分支没有的(分支提交记录)
git log test1 ^master

# 查看test2中比master多提交了哪些内容
git log master..test2

# 显示所有有差异的文件列表
git diff test1 master --stat

# 显示两个分支上两个文件的具体差异
git diff test02 master app/Http/Controllers/Post.php

# 显示所有差异文件的详细差异
git diff test02 master
----------------------------

git远程分支,返回之前commit提交位置

----------------------------
git log 

commit 8a4a2aff4ec387bfd49624de1fc34aef7b11d9ca (HEAD -> develop, origin/develop)
Merge: 4e49bd5e 02288018
Author: xxx 
Date:   Thu Oct 11 16:08:13 2018 +0800

    feat:CMS29期 permissions调整

commit 022880188fc8533edf78a125176f43c8f8567552
Author: xxx 
Date:   Fri Sep 28 12:00:18 2018 +0800

    feat:App8.0 主题模块接口文档 -> 参数调整


git reset --hard 022880
git reset 022880

git push origin develop --force
----------------------------
原文地址:https://www.cnblogs.com/Mr-Wenyan/p/9549707.html