欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Git

程序员文章站 2022-07-13 16:34:33
...

一 Git介绍

        说起Git用过的人应该都会说,Git是目前世界上最先进的分布式版本控制系统(没有之一)。说到版本控制系统,我这里就不进行详细说明了,可自行Google。

         当前主流的版本控制系统有SVN, CVS 和 Git。对于SVN和CVS,这两个版本控制系统都是典型的集中式版本控制系统,而Git是一个分布式版本控制系统。

        集中式版本控制系统:

        版本库是集中存放在*服务器的,在工作的时候,用的都是自己的电脑,所以首先要先从*服务器取得最新的版本,然后开始干活,活干完之后,再把自己的活推送给*服务器。*服务器负责管理所有版本,离开*服务器就没法工作。

        集中式最大的缺点就是,需要网络的支持。

                       Git

        分布式版本控制系统:

        首先,分布式版本控制系统根本没有“*服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

                    Git

        和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的*服务器要是出了问题,所有人都没法干活了。

        在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“*服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

二 Git的安装

     在Linux系统下安装Git:

在命令行中输入git

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

像上面的命令,有很多Linux会友好地告诉你Git没有安装,还会告诉你如何安装Git。

如果你碰巧用Debian或Ubuntu Linux,通过一条sudo apt-get install git就可以直接完成Git的安装,非常简单。

    在Windows上安装Git

在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!

                        Git   

三 安装完成之后进行配置

在安装完之后,首先需要对git进行配置(在Linux中,或window的 git Bash中输入以下命令),

$ git config --global user.name "Declan"
$ git config --global user.email "aaa@qq.com"

因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。

注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

可以如下命令查看自己做配置的信息:

git config --global -l

四 创建版本库

        什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

所以,创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录,然后在命令行切换道该目录下,执行命令:git init 即可创建一个将改目录初始化为一个git仓库。

$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/

 

五 Git 工作区和暂存区

    Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。

    1. 工作区

    就是你通过git init初始化过的文件夹

     2. 版本库

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

                   Git

前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

六 git命令

       1. 添加一个文件到git仓库: git add  xxx  (xxx为文件名)  (git add .   将该仓库中所有没有添加到git仓库的文件全部进行添加)。

       2. 提交命令:git commit -m "提交的说明"

       3. 查看仓库状态:git status 

       4. 查看某个文件的修改的内容:git diff xxx  (xxx为文件名)

      5.  命令显示从最近到最远的提交日志: git log  ,如果嫌输出信息太多,可以试试加上  --pretty oneline参数, git log --pretty=oneline  (其中一连串数字的,表示是版本号 commit id)

       6. 回退版本:在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100命令:git reset --hard HEAD^   表示回退到上一版本

        也可以使用git reset --hard 659646456   (其中一串数字表示commit id  可以不写全,写前几位即可,只要不重复)

        可以通过命令:git reflog 查看每一次提交的命令(可以查找所有版本的commit id)

    7. 对于文本文件可通过命令直接查看文件内容: cat readme.txt

    8. 撤销修改:git checkout --  readme.txt。意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commitgit add时的状态。

git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。  

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

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

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,使用git reset --hard HEAD^,不过前提是没有推送到远程库。

9. 删除文件:git rm readme.txt 进行删除,然后执行命令 git commit -m "注释"

  如果文件删错了,可以使用 git checkout -- readme.txt进行回退

七 远程仓库

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

$ ssh-****** -t rsa -C "aaa@qq.com"

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

第2步:登陆GitHub或码云,设置SSH KEY:

以码云为例:

         Git

然后,点“SSH公钥”,填上任意标题,在公钥文本框里粘贴id_rsa.pub文件的内容:

添加SSH 公钥是为了让码云识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,码云只要知道了你的公钥,就可以确认只有你自己才能推送。

当然,码云允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到码云,就可以在每台电脑上往码云推送了。

 

Git常用命令:

    1. 初始化一个git仓库:

            git init

    2. 配置git的全局用户名:

            git config --global user.name "Declan"

    3. 配置git的全局用户邮箱:

            git config --global user.email "aaa@qq.com"

    4. 查看配置的全局信息:

            git config --list

    5. 查看当前版本状态:

            git status

    6. 添加文件或修改到暂存区:

            git add <file>  /  git add .   #(添加所有的需要添加的文件或修改到暂存区)

    7. 提交到版本库: 

            git commit -m "提交的注释内容"

    8. 将add和commit合为一步操作:

            git commit -am “提交的注释内容”#(只能提交已经追踪过且修改过了的文件)

    9. 查看所有未添加至暂存区的修改:

            git diff 

    10. 查看所有已经添加至暂存区,但还没commit的变更:

            git diff --cached

    11. 查看日志:

            git log    /   git log --pretty=oneline  #(日志单行显示)    / git log --graph --pretty=oneline  #(以图的形式展示日志)

            git log -1    #显示最后一次提交的日志

    12. 退回到上一个版本:

            git reset --hard HEAD^   /   git reset --hard HEAD~1   #(1 表示上一个 版本,2 则表示上上一个版本,以此类推)

            git reset --hard <commit_id>

    13. 查看每一次的操作记录:

            git reflog 

    14. 查看工作区与版本库里最新版本的区别:

            git diff HEAD -- <file>

    15. 比较与上一个版本的区别:

            git diff HEAD^ 

    16. 丢弃工作区的修改:

            git checkout -- <file>    #(丢弃工作区指定文件还没有被add的修改) 

            git checkout  .                #(丢弃工作区内所有还没有被add的修改)

    17. 丢弃暂存区的修改 (将add到暂存区的修改撤销):

            git reset HEAD <file>

    18. 删除版本库的一个文件:

            git rm <file>   /  git rm -rf <file> #(递归删除,可以删除文件夹)

    19. 生成ssh key:

            ssh-****** -t rsa -C "aaa@qq.com"   #(会在用户的根目录下/.ssh 先生成两个文件:id_rsa  和 id_rsa.pub)

            校验远程仓库的ssh key是否添加成功:ssh -T aaa@qq.com

    20. git的push命令:

            git push <远程主机名> <本地分支名>:<远程分支名> #(例: git push origin declan将本地的declan分支推送至origin的declan分支,

                                                                                            如果远程declan分支不存在,则会创建该分支)

    21. git的pull命令:

            git pull <远程主机名> <远程分支名>:<本地分支名>   #(例:git pull origin declan:declan_1 拉取远程origin的declan分支到本地的declan_1分支,

                                                                                            如果本地的declan_1分支不存在,则会创建该分支)

    22. 本地仓库跟远程仓库建立连接:

            git remote add origin <项目地址>    # (将远程服务器上的项目跟本地已有的仓库关联起来,关联之后首    先就要进行远程代码的拉取pull和本地的推送push)

            git pull origin master                       #(将远程仓库的内容拉至本地,并跟本地的master分支进行merge)

            git push -u origin master #(将本地master分支推送到远程库的master分支中  加-u是为了将本地的master分支和远程库的master分支关联起来, 以后推送不需要加-u)

            git push -u -f origin master  #(将本地master分支强制推送到远程库的master分支中, -f表示强制推送,因为如果不加-f的话,可能会报错)

            git clone <项目地址>       #克隆一个远程仓库到本地

            git remote rm origin   #(删除本地已经关联的origin远程仓库)

 

分支管理

    23. 创建分支:     

            git branch dev        #创建dev分支

            git checkout dev    #切换到dev分支

            git checkou -b dev   #创建dev分支,并切换到dev分支     

    24. 查看分支:

            git branch    #(查看当前分支)

            git branch -a  #(列出所有分支)

            git branch -vv  #(查看本地当前分支信息)

            git remote -vv  #(查看远程仓库信息)

    25. 分支合并: 

            git merge dev  #(合并dev分支到当前分支)

    26. 删除分支:

            git branch -d dev      #(删除本地dev分支)

            git branch -D <name>  #(删除一个没有被合并过的分支)

            git push origin :dev  #(删除远程dev分支,分支名前面的 : 表示删除分支, 等同于:git push origin --delete dev)

    27. 查看分支合并图:

            git log --graph --pretty=oneline --abbrev-commit

    28. 禁用Fast forward 合并(分支管理策略:如果是Fast forward模式合并,删除掉分支后,会丢掉分支的提交信息,所以为了保留分支的提交信息,需要禁用Fast forward)

            git merge --no-ff -m “注释”dev  #在合并的时候同时提交,合并后的历史有分支,能看出来曾经做个合并

    29. git 保存工作现场:(使用与修复bug,在当前分支没有提交的情况下,新建一个新的临时分支)

           git stash              # 存储当前工作现场

           git stash list        #  查看保存的工作现场

           git stash apply    #  恢复stash内容,但是不会删掉保存的stash

           git stash apply aaa@qq.com{0}    #恢复指定的stash

           git stash drop     #  删掉保存的stash

           git stash pop      #  恢复stash内容,同时删除保存的stash

    30. 抓取远程仓库的某个分支:

           git checkout -b dev origin/dev   #在本地创建dev分支,同时将该分支与远程origin的dev分支关联起来

    31. 建立本地分支和远程分支的关联:

           git branch --set-upstream-to=origin/<remote_branch> <your_branch>  # 该命令在建立关联前,本地分支必须存在,不会自动创建本地分支

           git branch --set-upstream <your_branch> origin/<remote_branch> #该命令建立关联的过程中,如果本地的分支不存在,则会自动创建本地分支

    32. rebase把分叉的提交历史“整理”成一条直线:

           git rebase   #把本地未push的分叉提交历史整理成直线

标签管理

    33. 创建标签:

          git tag <name>  # 创建标签,如 git tab v1.0   该标签默认是在最新的commit上打的

          git tag <name> <commitId>  #在指定的commit id处打tag

          git tag -a <name> -m <说明文字> <commitId>   #-a 后面为tag名,-m后为该tag的说明,commitId是指为哪个提交打tag

    34. 查看所有标签:

           git tag    #列出所有的标签

    35. 查看标签的详细信息:

           git show <tag_name>

    36. 删除标签:

            git tag -d <tag_name>

    37. 推送标签到远程:

            git push origin <tag_name>  #创建的标签都只保存在本地,需要手动推送到远程仓库

           git push origin --tags   #一次性推送全部尚未推送到远程的本地标签

    38.  删除已经推送的tag:

            首先删除本地:git tag -d <tag_name> , 然后从远程删除:git push origin :refs/tags/<tag_name>  

 

Git的配置

  1. Git忽略文件 .gitignore

        git add -f App.class   #如果在.gitignore中已经添加了忽略.class文件,那么加上-f 就是强制添加到git

        git check-ignore -v App.class      #检查某个文件是否在.gitignore文件中已经添加忽略

    2. Git配置别名

        git config --global alias.st status   #为status配置了别名 st, 配置后就可以用 :git st 替代命令:git status了

        例:git config --global alias.lg  "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"   # 格式化了log,以后查看log就可以直接使用命令:git lg 了

    3. Git配置文件

        每个仓库的git配置文件在该仓库的 .git/config 中

        当前用户的git配置文件放在用户主目录下的一个隐藏文件:.gitconfig中

        在对git进行配置时,如果加上 --global, 是针对当前用户起作用,如果不加,则只是针对当前仓库起作用

 

        

转载于:https://my.oschina.net/Declan/blog/1789683

上一篇: Git~

下一篇: Git浅谈与使用