Git文件的几种状态:

  • 新增文件,且未增加至缓存区(stage/index)。例:newfile2
  • 新增文件,且已经增加至缓存区(stage/index)。例:newfile1
  • 当前分支库中有该文件,并且本地已修改(三个工作区只要文件内容不一样就会变红)。例:help.php
  • 当前分支库库中有该文件,并且本地未修改。例:1.txt
  • 在合并分支或pull 时,两个版本库有冲突。例:readme

Git 配置

一. 配置文件的存储位置


Git相关的配置文件有三个

1. C:/Program Files/Git/mingw64/etc/gitconfig:包含了适用于系统所有用户和所有项目的值。

  git config --system XXXXX

2.~/.gitconfig:只适用于当前登录用户的配置。(~/.gitconfig : C:/Users/用户/.gitconfig)

  git config --global XXXXX

3. 位于git项目目录中的.git/config:适用于特定git项目的配置。

  git config --local XXXXX

对于同一配置项,三个配置文件的优先级是1<2<3

git configについてのコマンド

 

Git 工作流程

Git 工作区、暂存区和版本库

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

下面这个图展示了工作区、暂存区和版本库之间的关系:

      

  *master只是一个分支,如果当前正在操作的分支是master的话,Head就会指向master(Head指向当前分支,并指向最近一次commit的版本)

  *图中index和master都用红线只想Object,实际他俩并不是指向同一个文件库,只是index和master指向的文件库都在.git文件夹中

  *具体分支和master和Head的关系:https://blog.csdn.net/u010874036/article/details/51422978?utm_source=blogxgwz6

1.图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区,标记为 "master" 的是 master 分支所代表的目录树。

2.此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。

3.图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。

4.当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。

5.当执行提交操作"git commit"时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。

6.当执行 "git reset HEAD" 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

7.当执行 "git rm --cached <file>" 命令时,会直接从暂存区删除文件,工作区则不做出改变。

8.当执行 "git checkout ." 或者 "git checkout -- <file>" 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。

9.当执行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

Git 创建仓库

git init

使用当前目录作为Git仓库 : git init

使用我们指定目录作为Git仓库 : git init newrepo

Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。

在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变(不像 SVN 会在每个子目录生成 .svn 目录,Git 只在仓库的根目录生成 .git 目录)。

 

如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交:


$ git add *.c
$ git add README
$ git commit -m '初始化项目版本'
以上命令将目录下以 .c 结尾及 README 文件提交到仓库中。

git clone

克隆仓库的命令格式为:git clone <repo>

克隆到指定的目录,可以使用以下命令格式:git clone <repo> <directory>

・比如,要克隆 Ruby 语言的 Git 代码仓库 Grit,可以用下面的命令:
$ git clone git://github.com/schacon/grit.git

  执行该命令后,会在当前目录下创建一个名为grit的目录,其中包含一个 .git 的目录,用于保存下载下来的所有版本记录。

・如果要自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字:
$ git clone git://github.com/schacon/grit.git mygrit
・几种效果等价的git clone写法:
git clone http://github.com/CosmosHua/locate new
git clone http://github.com/CosmosHua/locate.git new
git clone git://github.com/CosmosHua/locate new
git clone git://github.com/CosmosHua/locate.git new

・git clone 时,可以所用不同的协议,包括 ssh, git, https 等,其中最常用的是 ssh,因为速度较快,还可以配置公钥免输入密码。各种写法如下:
git clone git@github.com:fsliurujie/test.git         --SSH协议
git clone git://github.com/fsliurujie/test.git          --GIT协议
git clone https://github.com/fsliurujie/test.git      --HTTPS协议

Git 基本操作

Git 的工作就是创建和保存你的项目的快照及与之后的快照进行对比。

git add 

  该命令可将该文件添加到缓存,如我们添加以下两个文件:

--创建两个空白文件
$ touch readme
$ touch help.php
--查看文件列表
$ ls
$ ls -a
$ ls -s

--查看文件状态
$ git status -s
--增加到缓存区
$ git add readme help.php
--再次查看文件状态
$ git status -s
--Vim编辑器修改readme文件
$ vim readme
  a : vim变为插入模式
  输入文本
  Esc
  :wq
  Enter
--再次查看文件状态
$ git status -s
--再次将文件添加到暂存区
$ git add readme help.php
--再次查看文件状态
$ git status -s

 

--修改help.php文件
$ vim help.php
--查看文件内容
$ cat help.php
--再次查看文件状态
$ git statue -s
\\查看工作区与缓存区的区别
$ git diff

   touch : 用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的空白文件。

mv : 移动或重命名文件和目录。
  • mv file1.txt file2.txt:将file1文本重命名为file2。
  • mv file1.txt file2:讲file1文本移动到file2目录。
cat : 打印、合并文件件
  • cat file:将文件内容打印显示。
  • at file1 file2> target_file:将多个文件合并到目标文件中。
  • cat file1 file2 >> target_file:将几个文件附加到目标文件中。
ls : 用来显示目录或具体文件列表
  • ls -1:每行列出一个文件,即以单列形式列出。
  • ls -a:列出所有文件,包括隐藏文件。
  • ls -la:所有文件的长格式列表(含权限、所有权、大小和修改日期)。
  • ls -lh:使用人可读单位(KB,MB,GB)显示大小的长格式列表。
  • ls -lS:按大小排序的长格式列表(降序)。
  • ls -ltr:按大小排序的长格式列表(降序)。

git status 命令用于查看项目的当前状态。

  • git status 输出的命令很详细,但有些繁琐。
  • git status -s 以精简的方式显示文件状态。
  • git status -s 或 git status --short 命令,会得到更为紧凑的格式输出。
  • 新添加的未跟踪文件前面有 ?? 标记,
  • 新添加到暂存区中的文件前面有 A 标记,
  • 修改过的文件前面有 M标记。M 有两个可以出现的位置,出现在右边的 M 表示该文件被修改了但是还没放入暂存区,出现在靠左边的 M 表示该文件被修改了并放入了暂存区
  • 输出标记会有两列,第一列是对staging区域而言,第二列是对working目录而言。

git diff : 显示已写入缓存与已修改但尚未写入缓存的改动的区别。git diff 有两个主要的应用场景。

  • 尚未缓存的改动:git diff
  • 查看已缓存的改动: git diff --cached
  • 查看已缓存的与未缓存的所有改动:git diff HEAD
  • 显示摘要而非整个 diff:git diff --stat

git commit

使用 git add 命令将想要快照的内容写入缓存区, 而执行 git commit 将缓存区内容添加到仓库中。

Git 为你的每一个提交都记录你的名字与电子邮箱地址,所以第一步需要配置用户名和邮箱地址。

$ git config --global user.name 'runoob'
$ git config --global user.email test@runoob.com

接下来我们写入缓存,并提交对 hello.php 的所有改动。在首个例子中,我们使用 -m 选项以在命令行中提供提交注释。

$ git commit -m '初めてコミットする'

现在我们已经记录了快照。如果我们再执行 git status:

$ git status -s

以上输出说明我们在最近一次提交之后,没有做任何改动,是一个"working directory clean:干净的工作目录"。

如果你没有设置 -m 选项,Git 会尝试为你打开一个编辑器以填写提交信息。 如果 Git 在你对它的配置中找不到相关信息,默认会打开 vim。

如果你觉得 git add 提交缓存的流程太过繁琐,Git 也允许你用 -a 选项跳过这一步。命令格式如下:

git commit -a

我们先修改 hello.php 文件为以下内容:
<?php
echo '菜鸟教程:www.runoob.com';
echo '菜鸟教程:www.runoob.com';
?>
再执行以下命令:
git commit -am '修改 hello.php 文件'

git reset HEAD

git reset HEAD 命令用于取消已缓存的内容

git reset -- hard XXXX  (XXXX可以是HEAD或其他分支名称)

该命令不仅会把缓存区替换,也会把工作区替换,而且是替换成HEAD版本或其它分支版本

(如果不小心清除了还没有commit的缓存区的文件,可以看看这篇文章:

https://blog.csdn.net/qq_31608451/article/details/78342365?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task)

--我们先改动文件 README 文件,内容如下:
$ vim readme
readme → readme1

help.php 文件修改为:
$ help.php
help.php → help.php1

--在两个文件修改后,都先提交到缓存区:
$ git add .

--查看文件状态(可以看到两个M都是绿色的,说明到已经增加至缓存区)
$ git status -s

--然后我们现在要取消help.php缓存:
$ git reset head help.php

--查看文件状态(可以看到help.php的M已经变成红色,说明缓存区中的help.php已经没了)
$ git status -s

--现在执行 git commit,只会将 README 文件的改动提交,而 hello.php 是没有的。
$ git commit -m '改修'

--查看文件状态(可以看到help.php的M仍然是红色,说明缓help.php没有commit)
$ git status -s

 

git reset HEAD^

用于把已经commit之后的版本库回退到上一个版本

git rm

如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在 Changes not staged for commit 的提示。

要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除,然后提交。可以用以下命令完成此项工作

git rm <file>

如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f

git rm -f <file>

如果把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除,使用 --cached 选项即可

git rm --cached <file>

如我们删除 help.php文件:
$ git rm help.php 
rm 'help.php'
$ ls
README
不从工作区中删除文件: $ git rm
--cached README rm 'README' $ ls README

可以递归删除,即如果后面跟的是一个目录做为参数,则会递归删除整个目录中的所有子目录和文件:

git rm –r * 

 

Git 分支管理

列出分支基本命令:(没有参数时,git branch 会列出你在本地的分支--master。)

git branch

此例的意思就是,我们有一个叫做 master 的分支,并且该分支是当前分支。

当你执行 git init 的时候,默认情况下 Git 就会为你创建 master 分支。

----------------------------------------------------------------------------------------------------------------------------------------

创建分支

如果我们要手动创建一个分支。执行 git branch (branchname) 即可



---------------------------------------------------------------------------------------------------

在master分支创建一个新文本-test1.txt,在testing分支创建文本-test2.txt。并分别commit他们。

自两个分支互相切换时,test1.txt和test2.txt交替出现,本地文件夹也是如此。

(但是对于新添加文件,在没有commit之前(仅存在于工作区或缓存区),

无论切换到那个分支,都会显示该文件,当commit之后,该文件属于commit它的那个分支,

即使切换到创建该文件的分支时,也不再显示该文件。

对于版本库已有的文件,如果存在修改行为,则不允许切换分支.)

 ---------------------------------------------------------------------------------------------------

 分支互相切换

git checkout (branch)

 

 testing分支

master分支

 


 

删除分支

git branch -d (branchname)

--先创建一个分支testadd

 

 可以看到通过 git branch (分支名称)来创建分支之后,仍停留在master分支上.

 我们也可以使用 git checkout -b (branchname) 命令来创建新分支并立即切换到该分支下,从而在该分支中操作。

 


  ---------------------------------------------------------------------------------------------------

删除 testadd 分支,testadd1 分支:

 


 分支合并:

一旦某分支有了独立内容,你终究会希望将它合并回到你的主分支。 你可以使用以下命令将任何分支合并到当前分支中去:

git merge

★没有冲突文件时:

  可以看到现在有两个分支master和testing

  master分支有特有的test1.txt

  testing分支有特有的test2.txt

  其余文件完全相同的情况下进行合并

  testing分支有特有的test2.txt合并到了master分支中.

  

 

★有冲突文件时:

master分支中的readme文件内容:readme_master。

testing分支中的readme文件内容:readme_testing。

 


 

 

 

 本地手动修改readme文件后

 


 在 Git 中,我们可以用 git add 要告诉 Git 文件冲突已经解决

合并之后testing分支不变,master分支变成自己修改后的文件



合并过程中发生 Already up-to-date.,但是合并的两个版本库代码并不一样,
能是继上一次合并之后,两个版本库并未再次被提交导致版本号相同?
可以试试通过commit一个文件来改变要合并的版本库,之后再合并。

 


远程分支

 


 图为自己本地的git配置,图中的remote就是关于远程分支的配置信息,我们在push的时候可以指定该远程分支

   

 

 

       图为远程分支的git配置,可以看出该分支同样跟踪了一个远程分支。

  如果想要将自己的分支内容push到远程分支上,那么远程分支的配置中一定要有下面的属性 


 [receive]
         denyCurrentBranch = ignore

  否则的话会出现如下错误

jyq@jyq:~/work/Git/Robot$ git push origin master 
对象计数中: 5, 完成.
Delta compression using up to 4 threads.
压缩对象中: 100% (5/5), 完成.
写入对象中: 100% (5/5), 669 bytes | 0 bytes/s, 完成.
Total 5 (delta 0), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To git@192.168.30.11:/home/git/Code/Robot
 ! [remote rejected] master -> master (branch is currently checked out)
error: 无法推送一些引用到 'git@192.168.30.11:/home/git/Code/Robot'
————————————————
版权声明:本文为CSDN博主「小明37」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/we1583004we/java/article/details/80081053

 

git pull

git pull <远程主机名> <远程分支名>:<本地分支名>
注意:这里的:前后是必须没有空格的。

git pull origin master
表示将远程origin主机的master分支拉取过来和本地的当前分支进行合并。

  

    一句话总结git pull和git fetch的区别:

git pull = git fetch + git merge

git push

git push <远程主机名> <本地分支名>:<远程分支名>

注意:这里的:前后是必须没有空格的。

如果省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
git push origin master


git强制使用远程仓库代码覆盖本地仓库
$ git fetch origin master:temp

  本地新建分支temp,设定当前分支的 FETCH_HEAD 为远程服务器的master分支
  将远程主机origin的分支master复制到temp中
  (:temp不写默认 只设定当前分支的 FETCH_HEAD' 为远程服务器origin的master分支,可以通过origin/master来调用.不会新建分支)

$ git reset --hard temp
($ git reset --hard origin/master)

  将master指向temp分支(远程分支)
  将远程分支替换暂存区和工作区的内容

 

 

 

 本地舍弃了原来的节点,head指向了新的节点,导致工作区,暂存区(原来的),版本库(远程分支)的hash值不同,本地文件为红色



$ git pull origin master

$ git branch -D temp



解决ping github.com超时问题

第一步:前往目录C:\Windows\System32\drivers\etc\hosts文件
第二步:找到hosts文件,将它复制到桌面
第三步:使用编辑器打开hosts文件,在最末位置添加如下代码:


# GitHub地址
125.120.42.110 github.com git 
13.229.188.59 github.global.ssl.fastly.net

125.120.42.110这个IP地址需要修改成你的IP地址,点击查询,即可找到你的IP地址
13.229.188.59这个IP地址需要修改为GitHub的IP地址,即你执行ping github.com命令时,展示出的IP

第四步:修改完毕后,将hosts文件放回到原目录,替换原来的hosts文件。

最后,就可以ping通GitHub了






资料来源:
1.菜鸟教程
2.git配置用户信息 : https://www.cnblogs.com/kinglead/p/10979641.html

posted on 2020-06-18 10:09  主案曦  阅读(12)  评论(0)    收藏  举报