【Git】基础-2

文章目录

    • 4.git init和git clone
    • 5.git status
    • 6.ignore文件
    • 7.git diff
    • 8.git commit
    • 9.git rm
    • 10.git mv
    • 11.git log
    • 12.commit追加

4.git init和git clone

有两种方式可以获取git仓库:

  1. 将尚未进行版本管理的本地目录转换为git仓库
  2. 从其他服务器克隆一个已经存在的git仓库

本地目录创建git repository:

(1)创建本地目录

# mkdir lession03
# cd lession03

(2)将本地目录初始化为git仓库

# git init

克隆其他服务器的git repository:

# git clone https://github.com/libgit2/libgit2

自定义本地仓库的名称

# git clone https://github.com/libgit2/libgit2 mylibgit2

总结:

  1. 获取git仓库的两种方式:本地仓库init和远程仓库clone
序号 命令 说明
1 git init 本地目录初始化为git管理的项目,会在本地目录下创建.git文件夹
2 git clone 从远程服务器上clone一个git repository到本地

5.git status

在工作目录下,每个文件只有两种状态:已被追踪(untracked)和未被追踪的(tracked)。已被追踪的是指那些已经被纳入到版本管理的文件,在上一次快照中有它的记录。已被追踪的文件在unmodified、modified、staged这3种状态之间流转。未被追踪的文件是没有纳入到版本管理的文件。

Git 下文件生命周期图。

文件则3个区域流转的过程如下图所示:

git-satus

查看目录下文件状态:

# git status -s
 M a.txt
 M b.txt
A  c.txt
MM d.txt
?? e.txt

(1)创建一个状态为untracked的文件

# mkdir lession03
# cd lession03/
# echo "create a untracked file" >> a.txt
# git init
Initialized empty Git repository in /root/Desktop/git/lession03/.git/
# git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#	a.txt
nothing added to commit but untracked files present (use "git add" to track)
# git status -s
?? a.txt

(2)创建一个状态为A(newFile)的文件

# echo "create a A file" >> b.txt
# git status -s
?? a.txt
?? b.txt
# git add b.txt
# git status -s
A  b.txt
?? a.txt

(3)创建一个状态为AM(add modified)的文件

# echo "create a M file" >> c.txt
# git add c.txt
# echo "modified the file" >> c.txt
# git status -s
A  b.txt
AM c.txt
?? a.txt

(4)创建一个状态为M(—modified)的文件

# git commit -m "first commit" 
[master (root-commit) 79dc191] first commit
 2 files changed, 2 insertions(+)
 create mode 100644 b.txt
 create mode 100644 c.txt
# git status -s
 M c.txt
?? a.txt

(5)创建一个状态为MM(modified modified)的文件

# echo "create a MM file " >> d.txt
# git add d.txt
# git commit -m "second commit"
# echo "modified file " >> d.txt
# git add d.txt
# git status -s
 M c.txt
M  d.txt
?? a.txt
# echo "modified the file " >> d.txt
# git status -s
 M c.txt
MM d.txt
?? a.txt

(6)创建一个状态为D(delete)的文件,将一个已经纳入git的文件重新变更为untracked状态

# git rm --cached b.txt
rm 'b.txt'
# git status -s
D  b.txt
 M c.txt
 M d.txt
?? a.txt
?? b.txt

(7)重新将b.txt纳入到tracked状态

# git add b.txt
# git status -s
 M c.txt
 M d.txt
?? a.txt

(8)提交没有更新内容的情况

# git commit -m "fourth commit"
# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#	modified:   c.txt
#	modified:   d.txt
#
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#	a.txt
no changes added to commit (use "git add" and/or "git commit -a")

总结:

  1. 由git管理的文件存在3种状态:modified、staged、commited,没有被git管理的文件为untracked状态
  2. git add命令: 这是个多功能命令,可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 将这个命令理解为,“精确地将内容添加到下一次提交中”,而不是“将一个文件添加到项目中”要更加合适。
  3. git commit命令:将用git add添加的更新提交到.git目录。
序号 命令 说明
1 git status 查看文件的状态
2 git status -s 查看文件的状态,精简模式
3 git rm --cached 将文件变更到untracked状态

6.ignore文件

.gitignore的格式规范如下:

  1. 所有空行或者以#开头的行都会被git忽略
  2. 可以使用标准的glob模式匹配,它会递归的应用于整个工作区内
  3. 匹配模式可以以/开头防止递归
  4. 匹配模式可以以/结尾指定目录
  5. 要忽略指定模式以外的文件或目录,可以在模式前加上!取反

glob模式:

  1. *:匹配零个或多个字符
  2. [abc]:匹配任意一个在[]内的字符
  3. ?:匹配任意一个字符
  4. [0-9]:匹配0到9的数字
  5. **:匹配任意中间目录

.gitignore的例子:

# 忽略所有的.a文件
*.a
# 但tracked所有lib.a文件,前面忽略了所有.a文件
!lib.a
# 只忽略当前目录下的TODO文件,而不忽略subdir/TODO
/TODO

# 忽略任何目录下的build文件夹
build/

# 忽略doc/*.txt,但不忽略doc/server/*.txt
doc/*.txt

# 忽略doc目录及其子目录下的.pdf文件
doc/**/*.pdf

GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表, 你可以在 https://github.com/github/gitignore 找到它。

Java.gitignore:

# Compiled class file
*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

(1)创建新的工作区,初始化,编辑ignore文件,忽略所有.data,.o,.a和以~结尾的文件

# mkdir lession05
# cd lession05
# git init
Initialized empty Git repository in /root/Desktop/git/.git/
# vim .gitignore 
1 *.[oa]
2 *~
3 *.data

(2)创建一个.data文件,并暂存这个.data文件

# echo "a data file" >> a.data
# git add a.data
The following paths are ignored by one of your .gitignore files:
lession05/a.data
Use -f if you really want to add them.
fatal: no files added

总结:

  1. 在工作区下可以创建.gitignore文件,忽略不希望git追踪的文件
  2. ignore文件支持通配符

7.git diff

(1)创建一个新的工作区,初始化,添加新文件README和CONTRIBUTING

# mkdir lession06
# cd lession06
# git init
Initialized empty Git repository in /root/Desktop/git/lession06/.git/
# echo "readme file" >> README.md
# echo "Contributing file" > CONTRIBUTING.md

(2)将README文件变更为(绿M)状态,将CONTRIBUTING文件变更为(红M)状态

# git add .
# git commit -m "initial commit"
[master (root-commit) d9931f6] initial commit
 2 files changed, 2 insertions(+)
 create mode 100644 CONTRIBUTING.md
 create mode 100644 README.md
# echo "modify the readme file" >> README.md 
# echo "modify the contributting file" >> CONTRIBUTING.md 
# git status -s
 M CONTRIBUTING.md
 M README.md
[root@localhost lession06]# git add README.md
[root@localhost lession06]# git status -s
 M CONTRIBUTING.md
M  README.md
# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#	modified:   README.md
#
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#	modified:   CONTRIBUTING.md

(3)git diff,比较的是当前工作区和staged区的差异,也就是修改之后还没有暂存起来的差异。

# git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 11949af..c58e6ea 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1 +1,2 @@
 contributting file
+modify the contributting file

(4)git diff --staged,比较的是staged区和最后一次提交的差异。

# git diff --staged
diff --git a/README.md b/README.md
index 0bb9011..de03c04 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
 readme file
+modify the readme file

总结:

  1. git diff,比较的是staged区和当前工作区的差异
  2. git diff --staged或者git diff --cached,比较的是staged区和最后一次commit的差异
序号 命令 说明
1 git diff 比较工作区和staged区的差异
2 git diff --cached 比较staged区和最后一次commit的差异
3 git diff --staged git diff --cached的别名,相同的效果

8.git commit

(1)创建新的工作区,初始化,添加新的文件,commit

# mkdir lession07
# cd lession07/
# git init
Initialized empty Git repository in /root/Desktop/git/lession07/.git/
# echo "hello git" > a.txt
# git add a.txt
# git commit -m "initial commit"
[master (root-commit) 8da8b2c] initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 a.txt

(2)创建多个文件,使用commit -a提交

# git status -s
?? b.txt
?? c.txt
# git status 
# On branch master
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#	b.txt
#	c.txt
nothing added to commit but untracked files present (use "git add" to track)
# git commit -a -m "try to commit"
# On branch master
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#	b.txt
#	c.txt
nothing added to commit but untracked files present (use "git add" to track)

(3)将当前工作区的文件都变更为tracked,修改应将被tracked的文件,用commit -a提交

# git add .
You have new mail in /var/spool/mail/root
[root@localhost lession07]# git status -s
A  b.txt
A  c.txt
[root@localhost lession07]# echo "add a line" >> b.txt
[root@localhost lession07]# echo "add a line to c.txt" >> c.txt 
[root@localhost lession07]# git status -s
AM b.txt
AM c.txt
[root@localhost lession07]# git commit -am "second commit"
[master 2a5fdb5] second commit
 2 files changed, 4 insertions(+)
 create mode 100644 b.txt
 create mode 100644 c.txt

总结:

  1. 没有被tracked的文件,使用commit -a是不会被add并commit
  2. 已经被tracked的文件,使用commit -a会将当前工作区的变更直接跳过staged区,提交到committed状态。
序号 命令 说明
1 git commit -m “comment…” 提交,将位于staged区的更新写入到git仓库,-m指定本次提交的注释
2 git commit -am “comment…” 跳过staged区,直接将当前工作区的变更提交

9.git rm

(1)创建新的工作区,初始化,添加多个新的文件,添加,提交

# mkdir lession08
# cd lession08/
# git init
Initialized empty Git repository in /root/Desktop/git/lession08/.git/
# echo "a file" > a.txt
# echo "b file" > b.txt
# echo "c file" > c.txt
# git add .
# git commit -m "initial commit"
[master (root-commit) 0ecba4d] initial commit
 3 files changed, 3 insertions(+)
 create mode 100644 a.txt
 create mode 100644 b.txt
 create mode 100644 c.txt

(2)git rm,将a.txt从工作区和staged区删除,并且提交

# git rm a.txt
rm 'a.txt'
# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#	deleted:    a.txt
#
# git status -s
D  a.txt
# git commit -m "delete a.txt"
[master ff97dcc] delete a.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 a.txt
# git status -s
# ls
b.txt  c.txt

(3)使用git rm,将b.txt从staged区和工作区删除,恢复

# git rm b.txt
rm 'b.txt'
# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#	deleted:    b.txt
#
# git reset HEAD b.txt
Unstaged changes after reset:
D	b.txt
# git status
# On branch master
# Changes not staged for commit:
#   (use "git add/rm ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#	deleted:    b.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
# ls
c.txt
# git checkout -- b.txt
# git status
# On branch master
nothing to commit, working directory clean
# ls
b.txt  c.txt

(4)使用手工rm命令将c.txt删除,git rm在staged区添加删除的更新,git commit将删除更新提交

# rm -f c.txt 
# ls
b.txt
# git status -s
 D c.txt
# git status
# On branch master
# Changes not staged for commit:
#   (use "git add/rm ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#	deleted:    c.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
# git add c.txt
warning: You ran 'git add' with neither '-A (--all)' or '--ignore-removal',
whose behaviour will change in Git 2.0 with respect to paths you removed.
Paths like 'c.txt' that are
removed from your working tree are ignored with this version of Git.

* 'git add --ignore-removal ', which is the current default,
  ignores paths you removed from your working tree.

* 'git add --all ' will let you also record the removals.

Run 'git status' to check the paths you removed from your working tree.

You have new mail in /var/spool/mail/root
# git rm c.txt
rm 'c.txt'
[root@localhost lession08]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#	deleted:    c.txt
#
# git commit -m "delete c.txt"
[master b26bff5] delete c.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 c.txt

(5)创建log目录,模拟将log日志目录提交,将log目录从staged区和git仓库删除,但保留工作区内的log目录

# mkdir log
# cd log/
# echo "log file------------" > a.log
# echo "log file ............." > b.log
# ls
a.log  b.log
# cd ..
# git add .
# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#	new file:   log/a.log
#	new file:   log/b.log
#
# git commit -m "add log files"
[master 0abb971] add log files
 2 files changed, 2 insertions(+)
 create mode 100644 log/a.log
 create mode 100644 log/b.log
# git log --oneline
0abb971 add log files
b26bff5 delete c.txt
ff97dcc delete a.txt
0ecba4d initial commit
# git rm --cached log\/*.log
rm 'log/a.log'
rm 'log/b.log'
# ls
b.txt  log
# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#	deleted:    log/a.log
#	deleted:    log/b.log
#
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#	log/
# git commit -m "do not track the log/*.log"
[master c629b04] do not track the log/*.log
 2 files changed, 2 deletions(-)
 delete mode 100644 log/a.log
 delete mode 100644 log/b.log
# git status
# On branch master
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#	log/
nothing added to commit but untracked files present (use "git add" to track)

总结:

  1. 移除一个文件的git追踪,先git rm,再commit,之后,这个文件处于untracked状态
  2. 手动移除一个文件的git追踪,先rm,再git rm,最后commit
  3. 从staged区移除文件的git追踪,先git rm --cached,再commit,工作区将保留文件
序号 命令 说明
1 git rm 将文件移除,不再tracke该文件
2 git rm --cached 将文件移除,但在工作区保留,不再track该文件

10.git mv

(1)创建新的工作区,初始化,添加新文件,tracke新文件,提交

[root@localhost git]# mkdir lession09
[root@localhost git]# cd lession09
[root@localhost lession09]# git init
Initialized empty Git repository in /root/Desktop/git/lession09/.git/
[root@localhost lession09]# echo "a new file" > a.txt
[root@localhost lession09]# git add .
[root@localhost lession09]# git commit -m "initial commit"
[master (root-commit) 568fb90] initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 a.txt

(2)将文件重命名

[root@localhost lession09]# git mv a.txt newName.txt
[root@localhost lession09]# ls
newName.txt
[root@localhost lession09]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#	renamed:    a.txt -> newName.txt
#
[root@localhost lession09]# git commit -m "rename a.txt to newName.txt"
[master 2c92e85] rename a.txt to newName.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename a.txt => newName.txt (100%)
[root@localhost lession09]# git status
# On branch master
nothing to commit, working directory clean

(3)手动将newName.txt该回到a.txt

[root@localhost lession09]# mv newName.txt a.txt
[root@localhost lession09]# git status
# On branch master
# Changes not staged for commit:
#   (use "git add/rm ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#	deleted:    newName.txt
#
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#	a.txt
no changes added to commit (use "git add" and/or "git commit -a")
[root@localhost lession09]# git rm newName.txt
rm 'newName.txt'
[root@localhost lession09]# git add a.txt
[root@localhost lession09]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#	renamed:    newName.txt -> a.txt
#
[root@localhost lession09]# git commit -m "rename newName.txt to a.txt"
[master e8a3d45] rename newName.txt to a.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename newName.txt => a.txt (100%)
[root@localhost lession09]# git log --oneline
e8a3d45 rename newName.txt to a.txt
2c92e85 rename a.txt to newName.txt
568fb90 initial commit

总结:

  1. 使用git mv重命名
  2. git mv等价于mv+git rm oldFile+git add newFile
序号 命令 说明
1 git mv 重命名,oldFile改成newFile

11.git log

(1)创建新的工作区,clone示例仓库

[root@master git]# mkdir lession10
[root@master git]# cd lession10/
[root@master lession10]# git clone https://github.com/schacon/simplegit-progit
Cloning into 'simplegit-progit'...
remote: Enumerating objects: 13, done.
remote: Total 13 (delta 0), reused 0 (delta 0), pack-reused 13
Unpacking objects: 100% (13/13), done.
[root@master lession10]# ls
simplegit-progit
[root@master lession10]# cd simplegit-progit/
[root@master simplegit-progit]# ls
lib  Rakefile  README

(2)git log查看所有提交

[root@master simplegit-progit]# git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <[email protected]>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the verison number

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <[email protected]>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test code

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <[email protected]>
Date:   Sat Mar 15 10:31:28 2008 -0700

    first commit

(3)git log --patch -1查看最近的1个提交,列出修改的内容

[root@master simplegit-progit]# git log -p -1
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <[email protected]>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the verison number

diff --git a/Rakefile b/Rakefile
index a874b73..8f94139 100644
--- a/Rakefile
+++ b/Rakefile
@@ -5,7 +5,7 @@ require 'rake/gempackagetask'
 spec = Gem::Specification.new do |s|
     s.platform  =   Gem::Platform::RUBY
     s.name      =   "simplegit"
-    s.version   =   "0.1.0"
+    s.version   =   "0.1.1"
     s.author    =   "Scott Chacon"
     s.email     =   "[email protected]"
     s.summary   =   "A simple gem for using Git in Ruby code."

(4)git state查看所有提交的简要统计

[root@master simplegit-progit]# git log --stat -1
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <[email protected]>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the verison number

 Rakefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(5)git pretty,查看所有提交,以指定形式打印

[root@master simplegit-progit]# git log --pretty=format:"%h - %an, %ar: %s"
ca82a6d - Scott Chacon, 12 years ago: changed the verison number
085bb3b - Scott Chacon, 12 years ago: removed unnecessary test code
a11bef0 - Scott Chacon, 12 years ago: first commit

(6)限制log输出的内容

[root@master simplegit-progit]# git log --pretty=format:"%h - %an,%ad: %s" --date=short --after="2008-03-16"
ca82a6d - Scott Chacon,2008-03-17: changed the verison number
085bb3b - Scott Chacon,2008-03-15: removed unnecessary test code

总结:

  1. git log可以查看所有commit的历史
序号 命令 说明
1 git log 查看所有提交
2 git log --patch -1 查看最近一个提交,列出变更的详细信息
3 git log --stat 查看所有提交,列出变更的简要统计
4 git log --pretty=format:"%h - %an,%ad: %s" --date=short 查看所有提交,指定log的打印格式
5 git log --after="" --before="" 查看所有提交,指定开始和结束时间

12.commit追加

(1)创建新的工作区,初始化, 创建几个新文件,git add其中2个

# mkdir lession11
# cd lession11/
# git init
Initialized empty Git repository in /root/git/lession11/.git/
# echo "aaaaaaaaa" >> a.txt
# echo "bbbbbbbbb" > b.txt
# echo "ccccccccc" > c.txt
# git add a.txt b.txt
# git status -s
A  a.txt
A  b.txt
?? c.txt

(2)git commit

# git commit -m "initial commit"
[master (root-commit) 0664bb0] initial commit
 2 files changed, 2 insertions(+)
 create mode 100644 a.txt
 create mode 100644 b.txt
[root@slave1 lession11]# git log
commit 0664bb06bbced390e6094504f91879b50810b1e7
Author: JimGreen <[email protected]>
Date:   Fri Aug 7 19:17:29 2020 +0800

    initial commit

(3)git commit --amend

# git add c.txt
[root@slave1 lession11]# git commit --amend
[master 2e0c714] initial commit
 3 files changed, 3 insertions(+)
 create mode 100644 a.txt
 create mode 100644 b.txt
 create mode 100644 c.txt
[root@slave1 lession11]# git log
commit 2e0c7147b45db9c0583691a8341f7a9a6a80f53d
Author: JimGreen <[email protected]>
Date:   Fri Aug 7 19:17:29 2020 +0800

    initial commit

(4)对更新进行追加

# echo "append" >> a.txt
# git add a.txt
# git status -s
M  a.txt
# echo "append" >> b.txt
# git status -s
M  a.txt
 M b.txt
 
# git commit -m "second commit"
[master 3959f56] second commit
 1 file changed, 1 insertion(+)
# git log
commit 3959f569fe9d590468c977b5994013cf79ff7b02
Author: JimGreen <[email protected]>
Date:   Fri Aug 7 19:26:01 2020 +0800

    second commit

commit 2e0c7147b45db9c0583691a8341f7a9a6a80f53d
Author: JimGreen <[email protected]>
Date:   Fri Aug 7 19:17:29 2020 +0800

    initial commit
# git status -s
 M b.txt
# git add b.txt
# git commit --amend
[master b11013a] second commit
 2 files changed, 2 insertions(+)
# git log
commit b11013ac32e6f5da0bc63c1865e1da57b33322b8
Author: JimGreen <[email protected]>
Date:   Fri Aug 7 19:26:01 2020 +0800

    second commit

commit 2e0c7147b45db9c0583691a8341f7a9a6a80f53d
Author: JimGreen <[email protected]>
Date:   Fri Aug 7 19:17:29 2020 +0800

    initial commit
# git status
# On branch master
nothing to commit, working directory clean

你可能感兴趣的:(Git)