git教程

命令总结

本地git命令

感觉git常用的几个:addcommitcheckoutmerge esetpushpull,其他的都没怎么用

git add filename

git commit -m "message"

github命令

$ ssh-keygen -t rsa -C "youremail@example.com"

git 是什么

Git是目前世界上最先进的分布式版本控制系统,简而言之,可以用作回滚文件版本,把你在过程中的任何版本都保留下来。

分布式和集中式的区别

集中式:干活之前先从中央服务器获得文件的最新版本,干完活再推送给中央服务器,必须要联网(网速限制了其使用的效果)

分布式:每个人电脑上有一个完整的版本库,中央服务器只是用来交换大家的修改

安装git

Linux上安装git:

$ git
 The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git

Mac OS X上面安装git

Xcode里面自带了git,因此你只需要从App Store安装Xcode即可

WINDOWS 安装git

Windows下要使用很多Linux/Unix的工具时,需要Cygwin这样的模拟环境,Git也一样。Cygwin的安装和配置都比较复杂,就不建议你折腾了。不过,有高人已经把模拟环境和Git都打包好了,名叫msysgit,只需要下载一个单独的exe安装程序,其他什么也不用装,绝对好用。

msysgit是Windows版的Git,从https://git-for-windows.github.io下载(网速慢的同学请移步国内镜像),然后按默认选项安装即可。安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!

安装完成之后,设置git的名字和email地址,用于在网络上区分用户

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

创建版本库

版本库又称为仓库,英文名为:repository,可以理解成一个目录,这个目录下任何文件的更改删除都能被git跟踪,任何时候都可以将其还原

创建一个版本库

选择一个合适的地方创建一个空目录:

$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit

pwd:用于显示当前所在目录的命令

使用windows系统是,请确保文件路径中没有中文

初始化git
​```shell
$ git init


此时你的文件夹中应该出现一个.git隐藏文件,如果要显示该隐藏文件,输入如下命令:

​``` shell
$ ls -a

其中ls的意思是list,列出

把文件添加到版本库

首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。同样,word的改动也不能被跟踪。

注意:不能用windows自带的记事本来编写文件,因为其UTF-8的标准有问题(在文本最前面加了一段十六进制字符)

现在我们先建立一个readme.txt 文件,内容如下

Git is a version control system.
Git is free software.

把一个文件放到git只需要两部

  1. git add指令把文件添加到仓库
$ git add readme.txt

没有任何显示表示提交成功

  1. git commit指令告诉git,把文件提交到仓库
$ git commit -m "wrote a redme file"
[master (root-commit) cb926e7] wrote a readme file
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt

简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录

查看文件的各个版本

我们现在修改readme.txt为如下内容:

Git is a distributed version control system.
Git is free software.

现在运行git status可以看到文件已经modified,但是还没有添加:

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#    modified:   readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

接下来,我们使用git diff查看文件的具体变化:

$ git diff readme.txt 
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
 Git is free software.

git diff 顾名思义就是 difference

接下来,我们将提交文件,git add

$ git add readme.txt

在执行git commit之前,我们先运行git status看看当前仓库状态

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   readme.txt
#

git status告诉我们,readme.txt文件将要被提交,接下来,我们是用git commit提交文件

$ git commit -m "add distributed"
[master ea34578] add distributed
 1 file changed, 1 insertion(+), 1 deletion(-)

接下来,我们再用git status查看当前仓库的状态

$ git status
# On branch master
nothing to commit (working directory clean)

版本回退

现在已经学会了如何修改文件,那么我们再试着做一次,修改readme.txt文件内容如下:

Git is a distributed version control system.
Git is free software distributed under the GPL.

然后用git status查看git状态,然后用git diff查看修改的内容,最终用git addgit commit提交修改

$ git add readme.txt
$ git commit -m "append GPL"
[master 3628164] append GPL
 1 file changed, 1 insertion(+), 1 deletion(-)

一旦出现错误,这样,我们就可以从最近的一个commit开始恢复

现在,我们回顾一下readme.txt文件一共有几个版本被提交到Git仓库里了:

版本1:wrote a readme file

Git is a version control system.
Git is free software.

版本2:add distributed

Git is a distributed version control system.
Git is free software.

版本3:append GPL

Git is a distributed version control system.
Git is free software distributed under the GPL.

git log命令,我们可以查看从最近到最远的提交日志,我们可以看到3次提交,最近的一次是append GPL,上一次是add distributed,最早的一次是wrote a readme file。如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

运行:

$ git reset --hard HEAD^
HEAD is now at ea34578 add distributed

hard指令的具体含义我们会在后面说明

此时看到,已经回到了上一个版本,但是我们会发现,最新的那个版本不见了。

为了找到最新的版本,我们应该向上找到那个版本号c82373d096fbc635b12d4cd,然后

$ git reset --hard c82373
HEAD is now at c82373 add distributed

版本号不用全部填写,只要写一部分就可以了

但是,如果我们已经关闭了串口怎么办,这个时候,我们就需要git reflog,找到之前的命令

$ git reflog
ea34578 HEAD@{0}: reset: moving to HEAD^
3628164 HEAD@{1}: commit: append GPL
ea34578 HEAD@{2}: commit: add distributed
cb926e7 HEAD@{3}: commit (initial): wrote a readme file

这样,我们看到第二行的id,我们就可以回滚了

小结:

  • HEAD用来指定会退的版本,git reset --hard commit_id用来回退
  • 可以用git log 查看历史版本
  • 用git relog 查看历史命令,以回退历史版本

工作区和暂存区

工作区

工作区就是我们之前创建的git文件夹

版本库

工作区当中有一个隐藏的.git文件,称为版本库,git版本库中保存了stage暂存区,和git自动创建的第一个分支master,以及指向master的一个指针叫head

git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

Git管理的是修改,比如你的文件修改后->add->第二次修改->commit,那么此时系统中保留的是你第一次修改的内容,可以用git diff HEAD -- readme.txt命令查看当前Git中的文件和最新的文件的区别

撤销修改

用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区:

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

删除文件

一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:

$ rm test.txt

现在,你可以用git rm test.txt来删除git中的文件,要么你可以用git checkout -- test.txt来恢复文件

使用github

第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsaid_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

$ ssh-keygen -t rsa -C "youremail@example.com"

如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:然后,

点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:

添加远程库

首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库:

在本地的git仓库下运行命令:

$ git remote add origin git@github.com:drawwon/learngit.git

请千万注意,把上面的drawwon替换成你自己的GitHub账户名,否则,你在本地关联的就是我的远程库,关联没有问题,但是你以后推送是推不上去的,因为你的SSH Key公钥不在我的账户列表中。

注意:此时如果失败,可能是因为你创建库的时候添加了readme文件,那么本地文件就少一个readme.md,因此我们要先从远程pull下来才行,

git pull origin master --allow-unrelated-histories

最后的--allow-unrelated-histories:是因为github不允许两个没有建立连接的库进行通信

再次push

$ git push -u origin master

-u:与远程库的master分支连接起来,在以后推送时简化命令

从现在开始,只需要在本地使用如下命令,即可push到github

$ git push origin master

命令小结

要关联一个远程库,使用命令git remote add origin git@github.com:drawwon/repo-name.git

关联后,使用命令git push -u origin master第一次推送master分支的所有内容;

此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;

从远程库克隆

要使用github开发最好的方式就是先在远程创建一个repository,勾选添加readme文件,然后git clone远程库

$ git clone git@github.com:drawwon/learngit.git

或者

$ git clone https://github.com/drawwon/leargit.git

但是通过原生git的方式最快

分支管理

创建分支

首先,我们传建一个dev分支,并切换到dev分支:

$ git checkout -b dev
Switched to a new branch 'dev'

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'

我们修改readme.txt并提交:

$ git add readme.txt 
$ git commit -m "branch test"
[dev fec145a] branch test
 1 file changed, 1 insertion(+)

先在切换回master分支:

git checkout master

可以看到我们之前增加的内容不见了

现在,我们把dev分支的成果合并到master上面:

git merge <name>  #合并分支到当前分支上面

如果需要有历史版本的merge,那么请使用--no-ff

 git merge --no-ff -m "merge with no-ff" dev 
原文地址:https://www.cnblogs.com/drawon/p/8520497.html