Git

Git简单介绍

 啥是git ?

Git是什么?
Git是目前世界上最先进的分布式版本控制系统(没有之一)。

Git有什么特点?
简单来说就是:高端大气上档次!

那什么是版本控制系统?
有这样一个软件,不但能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以,岂不是很方便?

git的安装

在 Linux 上安装

如果你想在 Linux 上用二进制安装程序来安装 Git,可以使用发行版包含的基础软件包管理工具来安装。 如果以Centos 上为例,你可以使用 yum:

sudo yum install git

如果你在基于 Debian 的发行版上,请尝试用 apt-get:

sudo apt-get install git

在 Mac 上安装

在mac安装git方式很多,最简单是用brew包管理

安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/

brew install git

如果你想安装更新的版本,可以使用二进制安装程序。 官方维护的 OSX Git 安装程序可以在 Git 官方网站下载,网址为 http://git-scm.com/download/mac

Windows安装

在Windows上使用Git,可以从Git官网直接下载安装程序,(网速慢的请移步国内镜像),然后按默认选项安装即可。

安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!

运行git前的配置

既然已经在系统上安装了 Git,你会想要做几件事来定制你的 Git 环境。 每台计算机上只需要配置一次,程序升级时会保留配置信息。 你可以在任何时候再次通过运行命令来修改它们。

Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:

这个用户指的是linux用户

  1. /etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果使用带有 --system 选项的 git config 时,它会从此文件读写配置变量。

  2. ~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。 可以传递 --global 选项让 Git 读写此文件。

  3. 当前使用仓库的 Git 目录中的 config 文件(就是 .git/config):针对该仓库。 --local 当前仓库配置

用户信息

当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改:

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

git配置相关命令

yum install git -y  安装git

git --version  查看git版本 git config --system --list 查看系统所有linux用户的通用配置,此命令检查/etc/gitconfig

git config --global --list 查看当前linux用户的配置,检查~/.gitconfig文件

git config --local --list 查看git目录中的仓库配置文件,.git/config文件

git config --global user.name "huang"  配置当前linux用户全局用户名,这台机器所有git仓库都会用这个配置

git config --global user.email "ahuang@163.com" 配置当前linux用户全局邮箱

git config --global color.ui true 配置git语法高亮显示

git config --list 列出git能找到的所有配置,从不同的文件中读取所有结果

git config user.name  列出git某一项配置

git help 获取git帮助

man git man手册

git help config 获取config命令的手册

git工作流程

 使用git就是将本地文件(工作目录workspace)的文件,添加到暂存区(stage),然后提交到本地仓库(repository),最终可以协同开发,推送到远程仓库(remote)

Git操作

git操作一、建立Git仓库

git版本库,也叫做git仓库(repository),也就是一个文件夹。

这个目录的所有内容被git软件管理,所有的修改,删除,git都会跟踪记录,便于可以跟踪历史记录,以后可以还原文件。

两种场景需求:

1.把已有的项目代码,纳入git管理

cd mysite    mysite项目所在代码
git init     初始化git仓库

git init命令会创建一个.git隐藏子目录,这个目录包含初始化git仓库所有的核心文件。
此步仅仅是初始化,此时项目里的代码还没有被git跟踪,因此还需要git add对项目文件跟踪,然后git commit提交到本地仓库

想知道.git文件做了什么事,请看git原理 >Git 内部原理 

2.新建一个项目,直接用git管理

cd 某个文件夹
git init mysite      此步会在当前路径创建mysite文件夹,mysite文件夹中包含了.git的初始化文件夹,所有配置

那么.git文件夹中有什么呢?

.git文件夹解析

3.获取远程仓库代码

 如果你想获取github上的代码,或者你公司gitlab私有仓库的代码,可以使用git clone命令,下载克隆远程仓库的代码。

git clone https://github.com/django/django.git

你会发现所有的项目文件都在这里,等待后续开发。

git操作二、记录更新到本地仓库

还记得git的四个区域吗?本地文件夹,暂存区,本地仓库,远程仓库吗?

本地文件夹未初始化,git是不认识的

本地文件git init后,就成了git仓库

请记住,在工作文件夹的每一个文件,只有两种状态,一个是未跟踪,一个是已跟踪

已跟踪的指的是已经被纳入git版本管理的文件,在git快照中有他的记录

未跟踪的是这个文件既不在git快照中,也不在暂存区

git init初始化时的工作文件夹,都属于已跟踪了,后续的编辑操作都会标记为,已修改文件,因此需要将修改后的文件,加入暂存区,然后提交暂存区的文件。

 

检查文件状态

git status 
此命令查看git工作目录的文件,处于生命周期的哪一个状态 注意,只能在git工作目录中输入这个命令,他会去找.git文件夹 
第一次输入git status会看到此状态,没有任何东西需要提交
[root@HUANG ~/git_learning/mysite 12:00:34]#git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)

说明当前工作目录很干净,所有的已跟踪文件,已经被提交且未更改。
此时处在master默认分支。

git生命周期演练

git init mysite                          初始化git仓库

git status                                 查看git状态

echo 'print("挣了一个亿")' > main.py        新建一个代码文件,此时是未被git跟踪的

git status                                查看状态

    On branch master

    No commits yet

    Untracked files:
      (use "git add <file>..." to include in what will be committed)

        main.py

    nothing added to commit but untracked files present (use "git add" to track)

git add main.py  开始跟踪main.py文件

git status   此时再看已经被跟踪,现在已是可以被提交的状态,此时处于暂存区

git commit -m "echo main.py" 告诉git,把暂存区的main.py提交到本地仓库

git log     查看刚才的commit记录

给文件重命名

我们还是在git版本库中操作
修改main.py为mymain.py
mv main.py  mymain.py
查看状态
git status

直接mv的操作,会被git记录为两个形容,一、删除原有文件、二、新建了mymain.py文件
此时新文件还未被跟踪,需要git add , git commit
原本的main.py还需要从暂存区删除
[root@HUANG ~/mysite 14:57:57]#git status # On branch master # Changes not staged for commit: # (use "git add/rm <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # deleted: main.py # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # mymain.py no changes added to commit (use "git add" and/or "git commit -a")

git rm main.py  删除暂存区的main.py

git commit -m "mv mymain.py"  提交新的mymain.py

这样的步骤很麻烦,可以直接git mv 命令即可。刚才的mv记录,可以通过git log查看历史记录,已经提交的id。可以通过git reset 回退历史版本,回退到改名之前

[root@HUANG ~/mysite 15:10:12]#git log
commit f60fa7f1312843aa57edc9464192c9d891f23fb5
Author: HUANG <yc_uuu@163.com>
Date:   Sat Dec 22 15:08:02 2018 +0800

    mv mymain.py

commit 65e0a2239909fd5aabc5928ec4431de3f163a195
Author: HUANG <HUANG@163.com>
Date:   Sat Dec 22 14:51:07 2018 +0800

    echo main.py


回退到上一次commit版本,(注意这个命令,很危险,慎用)
git reset --hard 65e0a2239909fd5aabc5928ec4431de3f163a195 
--hard 清空暂存区和工作目录资料

改名最正确的姿势

git mv main.py mymain.py  

git commit -m "mv mymain.py"

查看git版本历史

在我们使用git的时候,会对代码文件不停的修改,不断的提交到代码仓库。当你的代码写好了一部分功能,就可以保存一个"存档",这个存档操作就是git commit,如果代码出错,可以随时回到"存档"记录,查看"存档"记录,查看commit提交记录的命令 git log

git log --oneline    一行显示git记录
git log --oneline  --all  一行显示所有分支git记录
git log --oneline --all -4 --graph 显示所有分支的版本演进的最近4条
git log -4  显示最近4条记录
git log --all     显示所有分支的commit信息




git branch -v 查看分支信息
git help --web log 以web界面显示log的参数

git版本回退

git log可以查看历史版本记录
git reset --hard命令可以回退版本
git reset --hard HEAD^ 回退到上个版本
HEAD表示当前版版本
HEAD^表示上个版本
HEAD^^上上个版本

也可以直接git reset --hard 版本id号

git穿梭未来

当你发现你git reset --hard回退错了。。。怎么办?别怕git reflog 记录了你每一次命令

git reflog
80f9496 HEAD@{1}: reset: moving to HEAD^
b7a8740 (HEAD -> master) HEAD@{2}: commit: echo 123
80f9496 HEAD@{3}: commit: echo my.txt
bf5879e HEAD@{4}: commit (initial): echo my.txt

我想回到某一个点,可以再次git reset --hard 版本id

git工作区

在我们进行git init mygit初始化一个git项目时,这个mygit文件夹,就是一个工作区(working Directory)

yudanL-2:mygit root# pwd
/data/mygit
yudanL-2:mygit root# ls
.git    my.txt

git仓库

工作区里有一个.git隐藏文件夹,就是git的本地仓库

.git文件夹里有一个index文件,就是git的暂存区,也叫做stage

.git文件夹里的HEAD文件就是git的一个指针

原理图

git记录的是工作区的修改记录

撤销修改记录,只能在未提交到暂存区之前 

git status
git checkout -- my.txt 放弃工作区的修改操作

如果你修改了文件,还添加到了暂存区 git add,那么只能撤销暂存区的操作,再撤销修改记录

git status    
git reset HEAD readme.txt  撤销暂存区的修改,unstage操作
git checkout -- readme.txt

git删除文件与恢复文件

如果你直接在工作区删除文件,动作会被git记录
rm -rf my.txt    删除了工作区的文件,git仓库还有记录
git status    查看状态,可以检测到my.txt被删除

如果确认文件无用,可以commit到git仓库
git rm "my.txt"
git commit -m "remove my.txt"

如果你想恢复文件,可以通过git仓库的代码,替换工作区的代码

rm -rf my.txt
git checkout -- my.txt

git stash

保存当前暂存区和工作区的改动存储起来,执行完毕git stash之后,再次运行git status就会发现当前已是个干净的工作区,通过git stash list查看结果

git stash 保存暂存区,工作区进度

git stash list 查看stash保存的列表以及id

git stash pop  恢复最新的stash进度到工作区

git stash pop stash_id  恢复指定的stash进度

git stash clear 清空所有存储的stash进度

git stash drop stash_id  删除一个存储的stash进度

git stash apply 恢复stash存储,且不删除stash list中的记录

git stash实际用法

git stash会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录。
比如下面的中间状态,通过git stash命令推送一个新的储藏,当前的工作目录就干净了。

[root@huang mydjango]# ls
manage.py  mydjango
#比如我临时想新建一个app01,进行开发,但是突然开发到一半,线上代码出bug了,我得立即去修复,我希望能临时存储一下,我目前的修改操作,bug完毕了,再找回来继续开发
[root@huang mydjango]# django-admin startapp app
[root@huang mydjango]#
[root@huang mydjango]#
[root@huang mydjango]# git add .
[root@huang mydjango]# git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: app/__init__.py # new file: app/admin.py # new file: app/apps.py # new file: app/migrations/__init__.py # new file: app/models.py # new file: app/tests.py # new file: app/views.py # [root@huang mydjango]# [root@huang mydjango]# [root@huang mydjango]# git stash Saved working directory and index state WIP on master: b16ccc0 v1 mydjango HEAD is now at b16ccc0 v1 mydjango
#此时app被放入暂存区,看不到了 [root@huabg mydjango]# ls manage.py mydjango

#这里应该使用 git stash save 存储名
git stash save "my app stash"

找回stash

[root@huang mydjango]# ls
manage.py  mydjango
[root@huang mydjango]# git stash pop # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: app/__init__.py # new file: app/admin.py # new file: app/apps.py # new file: app/migrations/__init__.py # new file: app/models.py # new file: app/tests.py # new file: app/views.py # Dropped refs/stash@{0} (5758c689354a34a168063a5bfa5d4bb3ca291f3b)
[root@huang mydjango]# ls app manage.py mydjango

查看stash列表

[root@huang mydjango]# git stash list
stash@{0}: WIP on master: b16ccc0 v1 mydjango

移除stash

默认删除第一个stash
[root@huang mydjango]# git stash drop
Dropped refs/stash@{0} (8af1c158977d5fe8bd398561ad8777514f8d22d1)

Git分支

 对写代码的工作进行分配,分给两个同事进行功能开发,他俩自己的分支别人看不到,当他俩代码写完后,合并到master主分支上,这样既保证主代码的安全,又能协同开发,互不影响。

git branch 分支名linux     创建分支linux
git checkout 分支名linux    切换分支到linux
git branch    查看当前分支情况,在哪一个就有*符
git check -- filename 一键还原文件,将git仓库的文件覆盖当前文件,危险命令
git checkout -b name  创建+切换新的分支

练习
创建linux分支,提交代码
git branch linux
git checkout linux
touch first.py
git add first.py
git commit -m “fenzhi linux commit v1”

此时切换回master分支,发现没有first.py文件

自动合并分支到master
git checkout master
git branch 
git merge linux    合并linux分支到master分支

合并完最好删掉无用的分支
git branch -d linux

自动合并可能会出现冲突报错,需手动解决冲突,解决自己想要的内容
对同名同目录的同一个文件操作,修改同一行数据就会冲突
git checkout master
echo “master” >> readme
git commit -a -m “master commit “ 提交代码到master仓库


切换到linux分支,此时已经看不到master主干的代码修改
git checkout linux
echo “linux” >> readme
git commit -a -m "linux commit”
git checkout master 此时查看文件内容,应该只有master,并没有linux
git merge linux  合并linux分支的代码,发现有一行冲突(both modified),
master与linux字符串,手动修改后重新提交

git commit -a -m "master merge commit” 提交本地代码到代码仓库
原文地址:https://www.cnblogs.com/huangqihui/p/10777692.html