#Git的概念:

- 分为工作区、暂存区、仓库(如编辑配置表,保存本地配置表,上传到svn)

  - 工作区到暂存区用add(添加)

  - 暂存区到仓库用commit(提交)

- git和svn的区别:git向上提交的是文件的修改,而非文件。SVN向上提交的是文件。例如:配置表内删除item.txt后要进行提交,git可以git add item.txt 而svn只能是在item.txt的所在文件夹,针对文件夹进行提交操作。 

 

# Git安装

- 官网下载:https://git-scm.com/downloads

  - 如遇下载中断可下载https://pan.baidu.com/s/1o_EybVySxjpw3chhpycxjQ

- windows : 下载后双击安装

- Linux:原则上可以从官网下载安装

- MacOS: 官网上下载dmg安装文件,双击 

 

# Git基本使用

- git默认路径是C盘,如果C盘容量不足,可以更改至其他盘,如果已经在C盘创建了本地仓库,可以先删除.git文件,再删除其余文件夹。

  在git文件目录下输入命令,删除本地仓库:   find . -name ".git" | xargs rm -Rf

  cd 创建了.git的文件夹

  git branch  #显示所有本地分支

  git init   #初始化本地版本库

  $ ls -a    #找到目录下.git

  rm -rf  .git   #删除

  可以看到master分支已经删除(test1中隐藏的.git文件夹已经删除)

  删除git之后,再返回去删除本地的库文件夹即可

 

- 创建仓库命令 git init

  mkdir 文件夹名称 : 创建文件夹

  cd 文件夹名称:进入文件夹

  ll -a ./文件夹名称:显示文件夹里的文件

  touch one.txt :创建one.txt文件

  vi 文件夹名称 :打开文件

  esc ->  :wq   :编辑文本文件下退出文件 

  cat one.txt : 查看one.txt文件内容

  ls : 查看当前文件夹下的文件

- git add : 向暂存区添加内容,如git add one.txt  把one.txt文件添加到暂存区

    可能会被提示warning: LF will be replaced by CRLF in readme.txt.The file will have its original line endings in your working directory. 

    解决方法:再次输入 git add 文件名+空格+回车

- git commit : 向仓库提交内容,如git commit one.txt  把one.txt文件提交到仓库

  提交时首行需要填写注释信息,如 add by who, 2 files, one.txt and two.txt

  - git commit -m "注释信息”   : 如此也可直接一步提交

- git status : 显示git当前状态,工作树、暂存区、本地版本库的对比

- git rm : 删除信息

    - rm 文件名 :删除工作区内的该文件

    - git rm 文件名 : 删除暂存区内的该文件

- git log : 查看日志

- git reset --hard 版本号 : 版本回滚

- github简介

  - git remote add : 添加内容到远程暂存区

  - git push : 移入远程仓库

  - git remote remove <远程库名称> :移除远程仓库,实例,git remote remove origin

- git的撤销修改

   - git checkout -- <文件名> : 把工作区的修改撤销掉,将工作区的版本回退到暂存区的版本或本地版本库的版本(当暂存区没有该文件的新版本时)。

  - git reset HEAD <文件名> : 把暂存区的修改撤销掉。

  - git reset --hard <版本号>  : 把本地版本库里的版本回退到某一个版本。

 

 

# 远程仓库

- git remote add origin <远程库地址> : 本地版本库关联远程库 。

- git push -u origin master :  第一次推送master分支的所有内容。(推送时显示no tracking information说明本地分支和远程分支的链接关系没有创建)

- git push origin master : 推送本地master分支的最新修改。

- git clone <远程库地址> : 从远程库里克隆一份到本地版本库

- git remote : 查看远程库名称

- git remote -v : 查看更详细的远程库信息,其中fetch代表可以抓取的地址,push代表可以推送的地址。如果没有推送权限,就看不到push的地址。

- git push origin master : 推送master分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上。分支是否推送远程库取决于多人协作中,其他人是否要与你公用该分支。

- git pull : 当git push失败时,git pull(抓取远程该分支的最新提交),解决完冲突再推送。

- git checkout -b <本地分支名> origin/<远程分支名> : 在本地和远程创建对应的分支,本地和远程分支的名称最好一样。

- git branch --set-upstream <本地分支名> origin/<远程分支名>,建立本地分支和远程分支的关联。

 

####解决push时遇到的问题####

#git使用https和ssh协议的区别:

  HTTPS:不管是谁,拿到url随便clone,但是在push的时候需要验证用户名和密码;
  SSH:clone的项目你必须是拥有者或者管理员,而且需要在clone前添加SSH Key。SSH 在push的时候,是不需要输入用户名的,如果配置SSH key的时候设置了密码,则需要输入密码的,否则直接是不需要输入密码的。

 

#ssh key 公钥相关问题:

  - cd ~/.ssh : 检查电脑是否已存在ssh key

  - ssh-keygen -t rsa -C "注册github时认证过的邮箱"  : 生成ssh key

  生成完秘钥后,会在 C:\Users\Administrator\.ssh 目录下 id_rsa和id_rsa.pub 两个文件,用记事本打开id_rsa.pub,全选复制到github主页setting——SSH and GPG keys界面的 New SSH key栏里。

 

问题:ssh_dispatch_run_fatal

 

解决方法:先打开cmd,ping一下显示的IP(192.30.253.112)看能否接通,若能则关闭防火墙。

 

问题:

解决办法:https://blog.csdn.net/zhoucheng05_13/article/details/52831703

 

 

 

# git的分支管理

- git分支的创建、删除与合并:

  - git checkout -b  <分支名> : 创建分支并切换到新分支

    - 这步操作等同于分别执行创建和切换,git branch <分支名> (创建分支),git checkout <分支名> (切换分支)。

  - git merge <分支名> : 将<分支名>这个分支合并到当前分支

  - git branch -d <分支名> : 删除分支

  - git branch : 查看所有分支

  - git log --pretty=oneline(简化日志)

  - git log --graph --pretty=oneline --abbrev-commit(查看分支的合并情况)

  - git merge --no-ff -m "备注信息" <分支名> : --no-ff参数表示禁用Fast forward,本次合并要创建一个新的commit,所以要加上-m参数。禁用Fast forward可以从分支历史上看出分支信息。合并时git会用Fast forward模式(如果可行的话),该模式下删除分支后,会丢失分支信息。

 

- bug分支 (应用场景:当在分支上工作到一半,发现要尽快修改另一分支上的一个bug时)

  - git stash : 保存当前工作场景

  - 恢复所保存的工作场景

    - git stash apply : 恢复后,stash内容不删除。

    - git stash list : 查看stash列表。

    - git stash pop : 恢复后,一并删除stash内容。

      有多次stash的情况下,恢复的时候,先用git stash list 查看,然后恢复指定的stash,命令:git stash apply stash@{X}

    - git branch -D <分支名> : 强行删除一个没有被合并过的分支。

 

    

 

 

# 备注

- 所有的版本都放在git文件夹内

 

- 在将文件提交到仓库之前要先填写用户名和邮箱(分为全局和本目录)

  - 设置全局用户名和邮箱操作命令如下:

    git config --global user.name "用户名"

    git config -- global user.email "邮箱"

  - 查看用户名和邮箱命令如下:

    git config user.name

    git config user.email

  - 修改本目录下仓库的用户名和邮箱

    git config user.name "用户名"

    git config user.email "邮箱"

  - 查看本目录下仓库的用户名和邮箱

    git config user.email 

    git config user.name

 

- 提交

    - 提交的时候首行不能为空,需填写注释信息

    - 提交后返回的结果如下:

    [master 744ef68] add by icev5 at 2.th      //master叫分支,744ef68是版本号,add by icev5 at 2.th是提交的注释信息

    2 files changed, 2 insertions(+)                //2个文档已修改,插入了2次

 

- VI编辑器是Linux下用的最多也是功能最强大的文本编辑器,VI具有三种模式:命令模式、编辑模式以及末行模式,在最初使用VI打开一个文件的时候,处在命令模式下,这时使用命令i、I、a、A、o、O都可以进入编辑模式,而想放回到命令模式只需要在编辑模式下敲击ESC键即可 

      - :w   保存修改

        :wq  保存修改并退出vi

        :q!  不保存修改并退出vi

        :wq!  不保存修改并退出vi(文件所有者忽略文件的只读属性)

- git remote set-url origin [git@github.com:username/repository.git 或 https://github.com/username/repository.git] : 切换ssh和http协议,使用https除了速度慢之外,而且每次推送都需要输入口令。

- git 分支的操作(创建、合并、删除)都非常快,只是切换指针而已,所以鼓励多使用分支,在分支上修改,然后再进行合并,提高安全性。

- git的教程详阅 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

- git-cheatsheet(操作命令备忘录):https://pan.baidu.com/s/1ZMPLAYc3t6VY2RZTqIUa6g