Git学习02:Git基本概念和常用指令

基本概念,参考菜鸟教程

 

以下是git常用命令的使用范围和场景,这个流程图可以辅助理解各个命令。

一、获取与创建项目命令

1- git init:用 git init 在目录中创建新的 Git 仓库。 你可以在任何时候、任何目录中这么做,完全是本地化的。

$ pwd
/c/Users/lenovo/mygit
$ mkdir myrepo
$ cd ./myrepo/
$ git init
Initialized empty Git repository in C:/Users/lenovo/mygit/myrepo/.git/

 

   项目中生成了 .git 子目录

$ ls -al
total 4
drwxr-xr-x 1 lenovo 197121 0 4月  10 08:05 ./
drwxr-xr-x 1 lenovo 197121 0 4月  10 08:05 ../
drwxr-xr-x 1 lenovo 197121 0 4月  10 08:05 .git/

 

2- git clone:使用 git clone 拷贝一个 Git 仓库到本地,让自己能够查看该项目,或者进行修改。

  格式:git clone [url]  [url] 为你想要复制的项目地址,比如从github上复制项目,如下

$ git clone https://github.com/tangyj5038/jenkinsdemo.git
Cloning into 'jenkinsdemo'...
remote: Enumerating objects: 15, done.
remote: Counting objects: 100% (15/15), done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 15 (delta 1), reused 15 (delta 1), pack-reused 0
Unpacking objects: 100% (15/15), done.

 

  复制下来后,再当前目录下会有一个项目文件夹,命名就是github链接最后一个“/”后的路径

$ ls -al
total 4
drwxr-xr-x 1 lenovo 197121 0 4月  10 08:12 ./
drwxr-xr-x 1 lenovo 197121 0 4月  10 08:05 ../
drwxr-xr-x 1 lenovo 197121 0 4月  10 08:05 .git/
drwxr-xr-x 1 lenovo 197121 0 4月  10 08:12 jenkinsdemo/

 

二、基本快照

1- git add:git add 命令可将该文件添加到缓存

#创建a.txt b.txt两个文件
$ touch a.txt $ touch b.txt #查看状态:?? a.txt $ git status
-s ?? a.txt ?? b.txt #将a.txt文件添加到缓存 $ git add a.txt #查看状态:A  a.txt $ git status -s A a.txt ?? b.txt

2- git status :用于查看项目的当前状态。

  官方解释:Displays paths that have differences between the index file and the current HEAD commit, paths that have differences between the working tree and the index file, and paths in the working tree that are not tracked by Git.

#创建a.txt b.txt两个文件
$ touch a.txt $ touch b.txt
#查看状态 $ git status
-s ?? a.txt ?? b.txt

 git status的提示信息

  Changes not staged for commit:出现这个提示下的所有文件改动,都是存在于工作区的。stage是暂存区的意思,not stage说明都不在暂存区,那么说明在工作区。

  Untracked files:说明出现这个提示下的所有文件都是当前HEAD没有被加入过的文件。这种改动也属于工作区。

  Changes to be committed:说明改动已经存在于暂存区,需要提交到本地库上去。执行完git commit以后,会把这条提示下面的所有改动作为一次commit提交到本地库上去。

  Unmerged paths:冲突的文件。在文件中把冲突都保留下来了,需要自己手动处理。

  On branch master:

git status -s和git status区别

  git status -s 以精简的方式显示文件状态。

  git status 输出的命令很详细,但有些繁琐。

  如果用 git status -s 或 git status --short 命令,会得到更为紧凑的格式输出。

status 标记

  ??:  新添加的未跟踪文件前面有 ?? 标记,

  A: 你本地新增的文件(服务器上没有). 

  C: 文件的一个新拷贝.

  D: 你本地删除的文件(服务器上还在).

  M: 文件的内容或者mode被修改了.

  R: 文件名被修改了。

  T: 文件的类型被修改了。

  U: 文件没有被合并(你需要完成合并才能进行提交)。

  X: 未知状态(很可能是遇到git的bug了,你可以向git提交bug report)。

  标记列:输出标记会有两列,第一列是对staging区域而言,第二列是对working目录而言。

 

3- git diff:执行 git diff 来查看执行 git status 的结果的详细信息。

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

  尚未缓存的改动:git diff

  查看已缓存的改动: git diff --cached

  查看已缓存的与未缓存的所有改动:git diff HEAD

  显示摘要而非整个 diff:git diff --stat

 

$ git diff
warning: LF will be replaced by CRLF in a.txt.
The file will have its original line endings in your working directory
diff --git a/a.txt b/a.txt
index e69de29..00bce73 100644
--- a/a.txt
+++ b/a.txt
@@ -0,0 +1 @@
+a.one


$ git diff --cached
diff --git a/a.txt b/a.txt
new file mode 100644
index 0000000..e69de29
diff --git a/c.txt b/c.txt
new file mode 100644
index 0000000..ce474eb
--- /dev/null
+++ b/c.txt
@@ -0,0 +1,3 @@
+
+c.one
+c.two


$ git diff HEAD
warning: LF will be replaced by CRLF in a.txt.
The file will have its original line endings in your working directory
diff --git a/a.txt b/a.txt
new file mode 100644
index 0000000..00bce73
--- /dev/null
+++ b/a.txt
@@ -0,0 +1 @@
+a.one
diff --git a/c.txt b/c.txt
new file mode 100644
index 0000000..ce474eb
--- /dev/null
+++ b/c.txt
@@ -0,0 +1,3 @@
+
+c.one
+c.two



$ git diff --stat
warning: LF will be replaced by CRLF in a.txt.
The file will have its original line endings in your working directory
 a.txt | 1 +
 1 file changed, 1 insertion(+)

 

 4- git commit:执行 git commit 将缓存区内容添加到仓库中。

   git commit -m 'message':这种是比较常见的用法,-m 参数表示可以直接输入后面的“message”,如果不加 -m参数,那么是不能直接输入message的,而是会调用一个编辑器一般是vim来让你输入这个message

  git commit -a -m ‘message’:其他功能如-m参数,加的-a参数可以将所有已跟踪文件中的执行修改或删除操作的文件都提交到本地仓库,即使它们没有经过git add添加到暂存区,注意,新加的文件(即没有被git系统管理的文件)是不能被提交到本地仓库的。建议一般不要使用-a参数,正常的提交还是使用git add先将要改动的文件添加到暂存区,再用git commit 提交到本地版本库。

  git commit --amend:叫追加提交,它可以在不增加一个新的commit-id的情况下将新修改的代码追加到前一次的commit-id中,

$ git commit -m 'second'
[master 9cec93a] second
 1 file changed, 1 insertion(+)

5-git reset HEAD:用于取消已缓存的内容,即 取消之前 git add 添加的信息

$ git status -s
A  d.txt
A  e.txt

$ git reset head d.txt

$ git status -s
A  e.txt
?? d.txt

 

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

  rm:只删除工作区的文件

  git rm <file>: 删除工作区文件,并且将这次删除放入暂存区。注意:要删除的文件是没有修改过的,就是说和当前版本库文件的内容相同。不相同是执行该命令会报错。

  git rm -f <file>:删除工作区和暂存区文件,并且将这次删除放入暂存区。注意: 要删除的文件已经修改过,就是说和当前版本库文件的内容不同。

  git rm --cached <file>: 删除暂存区文件,但保留工作区的文件,并且将这次删除放入暂存区。

$ touch e.txt
$ git add e.txt
$ vim e.txt
$ git status -s
 M e.txt
$ git rm e.txt
error: the following file has local modifications:
    e.txt
(use --cached to keep the file, or -f to force removal)
$ git rm -f e.txt
rm 'e.txt'
$ git status -s
D  e.txt

$ touch f.txt
$ git add f.txt
$ git rm --cached f.txt
rm 'f.txt'
$ git status -s
D  e.txt
?? f.txt

 

7- git mv: 用于移动或重命名一个文件、目录、软连接

  git mv 和 mv 的区别

  git mv行为:

    1.创建一个和之前文件内容一样的文件,文件名为新的文件名

    2.将原来的文件删除

    3.将删除的文件添加到暂存区

    4.将新建的文件添加到暂存区

  mv行为:

    只是重命名了一个文件

$ touch j.txt
$ git add j.txt
$ git status -s
A  j.txt
$ git mv j.txt k.txt
$ git status -s
A  k.txt

 

三-分支管理

1- git branch

  git branch 查看本地分支

  git branch  -r 查看远程分支

  git branch  -a 查看全部分支

 

$ git branch
* bone
  master

$ git branch -r
  origin/HEAD -> origin/master
  origin/master

$ git branch -a
* bone
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

 

 

 

  git branch dev 创建名为dev的分支,创建分支时需要是最新的环境,创建分支但依然停留在当前分支

  git branch -d dev 删除dev分支,如果在分支中有一些未merge的提交,那么会删除分支失败,此时可以使用 git branch -D dev:强制删除dev分支,

 

  git branch -vv 可以查看本地分支对应的远程分支

 

  git branch -m oldName newName 给分支重命名

lenovo@LAPTOP-76T7O2GU MINGW64 ~/mygit/myrepo/jenkinsdemo (bone)
$ git branch dev

lenovo@LAPTOP-76T7O2GU MINGW64 ~/mygit/myrepo/jenkinsdemo (bone)
$ git branch
* bone
  dev
  master

lenovo@LAPTOP-76T7O2GU MINGW64 ~/mygit/myrepo/jenkinsdemo (bone)
$ git branch -d dev
Deleted branch dev (was 627b625).

lenovo@LAPTOP-76T7O2GU MINGW64 ~/mygit/myrepo/jenkinsdemo (bone)
$ git branch
* bone
  master

lenovo@LAPTOP-76T7O2GU MINGW64 ~/mygit/myrepo/jenkinsdemo (bone)
$ git branch -vv
* bone   627b625 four
  master 627b625 [origin/master] four

lenovo@LAPTOP-76T7O2GU MINGW64 ~/mygit/myrepo/jenkinsdemo (bone)
$ git branch  -m bone branchone

lenovo@LAPTOP-76T7O2GU MINGW64 ~/mygit/myrepo/jenkinsdemo (branchone)
$ git branch
* branchone
  master

 

 

2-git checkout

  git checkout这个指令有些难懂,官方给出的解释是:Updates files in the working tree to match the version in the index or the specified tree. If no pathspec was given, git checkout will also update HEAD to set the specified branch as the current branch。即,更新工作区的的文件以匹配暂存区的版本;如果没有给出路径,则git chackout会更新HEAD,将指定的分支设置当前分支。

  git checkout branchname:切换分支

  git checkout -b (branchname) 

lenovo@LAPTOP-76T7O2GU MINGW64 ~/mygit/myrepo/jenkinsdemo (branchone)
$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

lenovo@LAPTOP-76T7O2GU MINGW64 ~/mygit/myrepo/jenkinsdemo (master)
$ git checkout -b branchtwo
Switched to a new branch 'branchtwo'

 

 

四、远程仓库

1-Git push:格式 git push <远程主机名> <本地分支名>  <远程分支名> 

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

  git push origin :refs/for/master 如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin --delete master

  git push origin  如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支

  git push 如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push

 

lenovo@LAPTOP-76T7O2GU MINGW64 ~/mygit/myrepo/jenkinsdemo (master)
$ git status -s
R  e.txt -> g.txt
A  h.txt
A  k.txt

lenovo@LAPTOP-76T7O2GU MINGW64 ~/mygit/myrepo/jenkinsdemo (master)
$ git push
Enumerating objects: 12, done.
Counting objects: 100% (12/12), done.
Delta compression using up to 8 threads
Compressing objects: 100% (8/8), done.
Writing objects: 100% (11/11), 900 bytes | 180.00 KiB/s, done.
Total 11 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), done.
To https://github.com/tangyj5038/jenkinsdemo.git
   e071a5f..627b625  master -> master

 

 

 

END

posted on 2020-04-10 15:53  我不吃番茄  阅读(229)  评论(0编辑  收藏  举报