创建一个仓库
git init 将当前目录变为 git 管理的仓库, 在成功执行此命令之后, 当前目录会出现 .git 文件
- [wangml@iZwz976helaylvgqok97prZ git]$ pwd
- /home/wangml/git
- [wangml@iZwz976helaylvgqok97prZ git]$ ls
- [wangml@iZwz976helaylvgqok97prZ git]$ git init
- Initialized empty Git repository in /home/wangml/git/.git/
- [wangml@iZwz976helaylvgqok97prZ git]$ ls -a
. .. .git
git 只能跟踪文本文件的变化情况, 而对于二进制文件却无能为力, 文本文件都是有编码的, 建议
仓库中文件使用同一种编码格式, 一般推荐使用 UTF-8
将一个文件添加到仓库中, 或者提交一个修改 (将工作区的文件加入 stage 暂存区)
git add filename
git commit 将文件提交到仓库, 而 -m 后的参数表示对于此次提交的说明 (将 stage 暂存区文件加
入 master 分支)
- git commit -m "Explain"
- [wangml@iZwz976helaylvgqok97prZ git]$ vim first.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ ls
- first.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ git add first.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ git commit -m "the first file"
- [master (root-commit) 8a16ecf] the first file
- 0 files changed, 0 insertions(+), 0 deletions(-)
- create mode 100644 first.txt
git status 查看仓库当前状态
- [wangml@iZwz976helaylvgqok97prZ git]$ git status
- # On branch master
- # Changed but not updated:
- # (use "git add <file>..." to update what will be committed)
- # (use "git checkout -- <file>..." to discard changes in working directory)
- #
- # modified: readme.txt
- #
- no changes added to commit (use "git add" and/or "git commit -a")
git diff 查看仓库与上次提交后有什么不同 (工作区文件与 master 中的区别)
- [wangml@iZwz976helaylvgqok97prZ git]$ git diff
- diff --git a/readme.txt b/readme.txt
- index e69de29..aede7aa 100644
- --- a/readme.txt
- +++ b/readme.txt
- @@ -0,0 +1,2 @@
- +don't stop don't stop
- +laughing about it
git log 查看仓库日志 (显示从最近到最远的提交日志)
- [wangml@iZwz976helaylvgqok97prZ git]$ git log
- commit 47c7f76657196394d9d776668cb2206c1927e1c9
- Author: wangml <wangml@iZwz976helaylvgqok97prZ.(none)>
- Date: Fri Aug 3 16:07:39 2018 +0800
- 20180803-16:07
- commit bfa08dc84f3f6f0b235f5a99c5ad4993bdfeb1f3
- Author: wangml <wangml@iZwz976helaylvgqok97prZ.(none)>
- Date: Wed Aug 1 21:49:30 2018 +0800
- add readme.txt
- commit 8a16ecff65e153fb435f4c0fa5060fbc3bac0bc2
- Author: wangml <wangml@iZwz976helaylvgqok97prZ.(none)>
- Date: Wed Aug 1 21:46:55 2018 +0800
- the first file
git log --pretty=oneline 将每次提交日志用一行显示
- [wangml@iZwz976helaylvgqok97prZ git]$ git log --pretty=oneline
- 47c7f76657196394d9d776668cb2206c1927e1c9 20180803-16:07
- bfa08dc84f3f6f0b235f5a99c5ad4993bdfeb1f3 add readme.txt
- 8a16ecff65e153fb435f4c0fa5060fbc3bac0bc2 the first file
上述显示的第一个字段的一长串是用 SHA1 计算出来的用 16 进制表示的 commit id(版本号)
在 git 中可以用 HEAD^ 表示上一个版本, HEAD^^ 表示上上的版本
或者使用 HEAD~N 表示最近提交的倒数第 N 个版本
git reset --hard HEAD~N 回退到倒数第 N 个版本
- [wangml@iZwz976helaylvgqok97prZ git]$ git reset --hard HEAD~
- HEAD is now at bfa08dc add readme.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ cat readme.txt
- [wangml@iZwz976helaylvgqok97prZ git]$
退回到上一个版本, 可以看到在上个版本中的 readme.txt 文件中没有任何内容
但如果此时我们希望不要回退, 让其变为 readme.txt 文件已被添加了内容的版本, 我们应该
怎么办呢? 此时我们无法使用 HEAD~N , 因为这个是指向当前版本之前的版本, 这时我们就
需要使用上述的 commit id
git reset --hard id 将仓库设置为 id 表示的版本
- [wangml@iZwz976helaylvgqok97prZ git]$ git reset --hard 47c7f76
- HEAD is now at 47c7f76 20180803-16:07
- [wangml@iZwz976helaylvgqok97prZ git]$ cat readme.txt
- don't stop don't stop
- laughing about it
git reflog 记录了我们使用的们一条命令, 也可以通过它找到不同版本的 commit id
- [wangml@iZwz976helaylvgqok97prZ git]$ git reflog
- 47c7f76 HEAD@{0}: 47c7f76657196394d9d776668cb2206c1927e1c9: updating HEAD
- bfa08dc HEAD@{1}: HEAD~: updating HEAD
- 47c7f76 HEAD@{2}: commit: 20180803-16:07
- bfa08dc HEAD@{3}: commit: add readme.txt
- 8a16ecf HEAD@{4}: commit (initial): the first file
注意: Git 跟踪并管理的是修改, 而非文件
git checkout -- filename 使 filename 文件回到最近一次 git add/commit 时的样子
这里有两种情况:
一种是 readme.txt 自修改后还没有被放到暂存区, 现在, 撤销修改就回到和版本库一模一样
的状态;
一种是 readme.txt 已经添加到暂存区后, 又作了修改, 现在, 撤销修改就回到添加到暂存区
后的状态.
一:
- [wangml@iZwz976helaylvgqok97prZ git]$ cat readme.txt
- don't stop don't stop
- laughing about it
- test for diff
- [wangml@iZwz976helaylvgqok97prZ git]$ vim readme.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ cat readme.txt
- don't stop don't stop
- laughing about it
- test for diff
- checkout...
- [wangml@iZwz976helaylvgqok97prZ git]$ git checkout -- readme.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ cat readme.txt
- don't stop don't stop
- laughing about it
- test for diff
二:
- [wangml@iZwz976helaylvgqok97prZ git]$ cat first.txt
- test for diff
- [wangml@iZwz976helaylvgqok97prZ git]$ vim first.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ cat first.txt
- test for diff
- checkout...
- [wangml@iZwz976helaylvgqok97prZ git]$ git add first.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ vim first.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ cat first.txt
- test for diff
- checkout...
- checkout2...
- [wangml@iZwz976helaylvgqok97prZ git]$ git checkout -- first.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ cat first.txt
- test for diff
- checkout...
git reset HEAD filename 可以把暂存区的修改撤销掉 (unstage), 重新放回工作区
- [wangml@iZwz976helaylvgqok97prZ git]$ cat readme.txt
- don't stop don't stop
- laughing about it
- test for diff
- checkout...
- [wangml@iZwz976helaylvgqok97prZ git]$ vim readme.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ cat readme.txt
- don't stop don't stop
- laughing about it
- test for diff
- checkout...
- reset...
- [wangml@iZwz976helaylvgqok97prZ git]$ git add readme.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ git status
- # On branch master
- # Changes to be committed:
- # (use "git reset HEAD <file>..." to unstage)
- #
- # modified: first.txt
- # modified: readme.txt
- #
- [wangml@iZwz976helaylvgqok97prZ git]$ git reset HEAD readme.txt
- Unstaged changes after reset:
- M readme.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ git status
- # On branch master
- # modified: readme.txt
rm filename 删除一个文件, 被删除的文件可以使用 git checkout -- filename 恢复
- [wangml@iZwz976helaylvgqok97prZ git]$ rm test.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ ls
- first.txt readme.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ git checkout -- test.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ ls
- first.txt readme.txt test.txt
git rm filename + git commit 从版本库中删除一个文件, 可以使用 git reset 恢复
- [wangml@iZwz976helaylvgqok97prZ git]$ ls
- first.txt readme.txt test.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ git add test.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ git commit -m "add test.txt"
- [master 7406bd5] add test.txt
- 1 files changed, 2 insertions(+), 0 deletions(-)
- create mode 100644 test.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ git rm test.txt
- rm 'test.txt'
- [wangml@iZwz976helaylvgqok97prZ git]$ ls
- first.txt readme.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ git commit -m "delete test.txt"
- [master e6a2486] delete test.txt
- 0 files changed, 0 insertions(+), 0 deletions(-)
- delete mode 100644 test.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ ls
- first.txt readme.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ git log
- commit e6a2486a711c71e7703804123008afe1e3aef2a1
- Author: wangml <wangml@iZwz976helaylvgqok97prZ.(none)>
- Date: Sat Aug 4 16:42:04 2018 +0800
- delete test.txt
- ...
- [wangml@iZwz976helaylvgqok97prZ git]$ git reset --hard 7406bd59979f1207f6dad4538
- HEAD is now at 7406bd5 add test.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ ls
- first.txt readme.txt test.txt
远程库相关:
git push ... 将本地仓库的 commit 推送到远程库中
git clone ... 克隆一个远程库到本地
git branch 分支名 创建一个新的分支
git checkout 分支名 选择指定的分支
上述两个命令等价于: git checkout -b 分支名
- [wangml@iZwz976helaylvgqok97prZ git]$ git branch var
- [wangml@iZwz976helaylvgqok97prZ git]$ git checkout var
- Switched to branch 'var'
git branch 查看当前分支
- [wangml@iZwz976helaylvgqok97prZ git]$ git branch
- master
- * var
在新创建的分支中做的改变对源分支没有影响, 如下示例: 在 var 分支中 对 test.txt 文件
加以修改并提交到版本库, 在回到 master 分支, 查看 test.txt 文件, 却发现 test.txt 文件没
有任何改变
- [wangml@iZwz976helaylvgqok97prZ git]$ vim test.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ cat test.txt
- branch... var
- [wangml@iZwz976helaylvgqok97prZ git]$ git add test.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ git commit -m "branch var..."
- [var d991370] branch var...
- 1 files changed, 1 insertions(+), 0 deletions(-)
- [wangml@iZwz976helaylvgqok97prZ git]$ git checkout master
- Switched to branch 'master'
- [wangml@iZwz976helaylvgqok97prZ git]$ cat test.txt
- [wangml@iZwz976helaylvgqok97prZ git]$
git merge 分支名 合并指定分支到当前所在的分支, 如下示例: 将 var 分支合并到 当前
分支 master 中, 可以看到 test.txt 文件内容变得和之前在 var 分支中修改后的内容一样
git log --graph 查看分支合并图
- [wangml@iZwz976helaylvgqok97prZ git]$ cat test.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ git branch
- * master
- var
- [wangml@iZwz976helaylvgqok97prZ git]$ cat test.txt
- [wangml@iZwz976helaylvgqok97prZ git]$ git merge var
- Updating 7406bd5..d991370
- Fast-forward
- test.txt | 1 +
- 1 files changed, 1 insertions(+), 0 deletions(-)
- [wangml@iZwz976helaylvgqok97prZ git]$ cat test.txt
- branch... var
git branch -d 分支名 删除指定分支
- [wangml@iZwz976helaylvgqok97prZ git]$ git branch
- * master
- var
- [wangml@iZwz976helaylvgqok97prZ git]$ git branch -d var
- Deleted branch var (was d991370).
- [wangml@iZwz976helaylvgqok97prZ git]$ git branch
- * master
注意: 当两个分支都做出了更改, 在对分支进行合并时可能会发生冲突, 此时需要将发生冲突的文
件作出修改之后在提交
git stash 将未提交的工作空间储存起来, 待以后恢复后在使用, 在使用 git stash 后可
以看到 working directory clean
- [wangml@iZwz976helaylvgqok97prZ git]$ git status
- # On branch var
- # Changed but not updated:
- # (use "git add <file>..." to update what will be committed)
- # (use "git checkout -- <file>..." to discard changes in working directory)
- #
- # modified: new.txt
- #
- no changes added to commit (use "git add" and/or "git commit -a")
- [wangml@iZwz976helaylvgqok97prZ git]$ git stash
- Saved working directory and index state WIP on var: 6fa8864 new file
- HEAD is now at 6fa8864 new file
- [wangml@iZwz976helaylvgqok97prZ git]$ git status
- # On branch var
- nothing to commit (working directory clean)
git stash list 列出已储存的工作空间
- [wangml@iZwz976helaylvgqok97prZ git]$ git stash list
- stash@{0}: WIP on var: 6fa8864 new file
git stash apply 恢复到上一个储存的工作空间
git stash drop 删除已储存的工作空间
上述两个命令一起用等于 git stash pop
- [wangml@iZwz976helaylvgqok97prZ git]$ git stash apply
- # On branch var
- # Changed but not updated:
- # (use "git add <file>..." to update what will be committed)
- # (use "git checkout -- <file>..." to discard changes in working directory)
- #
- # modified: new.txt
- #
- no changes added to commit (use "git add" and/or "git commit -a")
- [wangml@iZwz976helaylvgqok97prZ git]$ git stash drop
- Dropped refs/stash@{0} (fc7113d17f35a62b46cd7142c20ad1efa5f1d6b4)
来源: http://www.bubuko.com/infodetail-2717803.html