有两种方式可以获取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 | 本地目录初始化为git管理的项目,会在本地目录下创建.git文件夹 |
2 | git clone | 从远程服务器上clone一个git repository到本地 |
在工作目录下,每个文件只有两种状态:已被追踪(untracked)和未被追踪的(tracked)。已被追踪的是指那些已经被纳入到版本管理的文件,在上一次快照中有它的记录。已被追踪的文件在unmodified、modified、staged这3种状态之间流转。未被追踪的文件是没有纳入到版本管理的文件。
文件则3个区域流转的过程如下图所示:
查看目录下文件状态:
# 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 status | 查看文件的状态 |
2 | git status -s | 查看文件的状态,精简模式 |
3 | git rm --cached | 将文件变更到untracked状态 |
.gitignore的格式规范如下:
glob模式:
.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)创建一个新的工作区,初始化,添加新文件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 --cached | 比较staged区和最后一次commit的差异 |
3 | git diff --staged | git diff --cached的别名,相同的效果 |
(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 | git commit -m “comment…” | 提交,将位于staged区的更新写入到git仓库,-m指定本次提交的注释 |
2 | git commit -am “comment…” | 跳过staged区,直接将当前工作区的变更提交 |
(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 rm | 将文件移除,不再tracke该文件 |
2 | git rm --cached | 将文件移除,但在工作区保留,不再track该文件 |
(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 | 重命名,oldFile改成newFile |
(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 | 查看所有提交 |
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="" | 查看所有提交,指定开始和结束时间 |
(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