博学笃行·盛德日新

git自学1:git使用基础篇


git

git自学1: 使用基础篇

1. 如何创建一个git本地仓库?

# shell $> mkdir mygitdir
# shell $> cd mygitdir
# shell $> git init
Initialized empty Git repository in /Users/foreverich/git/mygitdir/.git/

此时会在mygitdir目录下创建一个.git的隐藏目录, 用于存储本地版本信息

2. 如何本地提交一个文件?

# shell $> echo 'git test' > readme.md
# shell $> git add readme.md

# shell $> git commit -m "add readme.me for test"
[master (root-commit) ca3c109] add readme.me for test
 1 file changed, 1 insertion(+)
 create mode 100644 readme.md
[master (root-commit) ca3c109] add readme.me for test
 1 file changed, 1 insertion(+)
 create mode 100644 readme.md

3. 查看git当前状态

# shell $> git status
On branch master
nothing to commit, working tree clean

# shell $> echo 'git new line' >> readme.md

# shell $> git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   readme.md

no changes added to commit (use "git add" and/or "git commit -a")

可以看到我们修改readme.md文件后, git status的状态变更了,说有未提交的内容

4. 查看git的具体变更内容git diff

# shell $> git diff 
diff --git a/readme.md b/readme.md
index f6edd6e..6e1edee 100644
--- a/readme.md
+++ b/readme.md
@@ -1 +1,2 @@
 git test
+git new line

特别注意: 此时是交互式的, 退出按q即可, 如果不想进入交互模式, 则添加如下选项: --exit-code

# shell $> git diff --exit-code
diff --git a/readme.md b/readme.md
index f6edd6e..6e1edee 100644
--- a/readme.md
+++ b/readme.md
@@ -1 +1,2 @@
 git test
+git new line

5. 再次提交修改的内容

# shell $> git add readme.md
# shell $> git commit -m "add new content to readme.md"
[master 5230322] add new content to readme.md
 1 file changed, 1 insertion(+)
# shell $> git status
On branch master
nothing to commit, working tree clean

可以发现再次提交后, git status提示版本仓库目录是干净的

6. 查看提交历史

# shell $> git log
commit 52303226fadd453f35f82fe793f40746fb814511 (HEAD -> master)
Author: foreverich <xxxxxx@example.com>
Date:   Tue Jul 31 22:37:12 2018 +0800

    add new content to readme.md

commit ca3c109e0f6d8738af7918b42cc4e6b0f0c7d5df
Author: foreverich <xxxxxx@example.com>
Date:   Tue Jul 31 22:19:15 2018 +0800

    add readme.me for test

可以看到我们提交了2次, 以及commit的hash值, 作者, 提交时间, 2次的commit内容

7. 对比git两次提交的差异

使用命令git diff hash1 hash2对比两次提交之间的差异

# shell $> git diff ca3c109e0f6d873 52303226fadd453f3
diff --git a/readme.md b/readme.md
index f6edd6e..6e1edee 100644
--- a/readme.md
+++ b/readme.md
@@ -1 +1,2 @@
 git test
+git new line

git diff只检查工作区和暂存区或本地仓库之间的差异
如果要比较暂存区与本地仓库之间的差异, 则需要使用 git diff --cached 指令

8. 在本地回退到上个版本

# shell $> git reset --hard HEAD^
HEAD is now at ca3c109 add readme.me for test

# shell $> cat readme.md
git test

HEAD表示当前版本, HEAD^表示上个版本, HEAD^^表示上2个版本, HEAD~100表示倒数第100个版本
也可以使用hash值来表示要退到的版本, 甚至刚刚消失的版本, 我们还可以撤退回来.

# shell $> git reset --hard 52303226fadd453f3
HEAD is now at 5230322 add new content to readme.md

# shell $> cat readme.md
git test
git new line

9. 如果你找不到git版本的hash,可以通过 git reflog查找

# shell $> git reflog
5230322 (HEAD -> master) HEAD@{0}: reset: moving to 52303226fadd453f3
ca3c109 HEAD@{1}: reset: moving to HEAD^
5230322 (HEAD -> master) HEAD@{2}: commit: add new content to readme.md
ca3c109 HEAD@{3}: commit (initial): add readme.me for test

10. 修改文件后, 还没有git add到暂存区撤销方法

# shell $> sed -i 's/new/second/g' readme.md
# shell $> echo 'the third line' >> readme.md
# shell $> cat readme.md
git test
git second line
the third line

# shell $> git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   readme.md

no changes added to commit (use "git add" and/or "git commit -a")

## 撤销文件的修改
# shell $> git checkout -- readme.md

## 再次查看文件内容, 会发现刚刚的修改已经撤销了
# shell $> cat readme.md
git test
git new line

git checkout – file命令中的–很重要,没有–,就变成了“切换到另一个分支”的命令

11. 修改文件后, 已经git add到暂存区的撤销方法

# shell $> echo 'git add readme line' >> readme.md
# shell $> git add readme.md

# shell $> git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   readme.md

## 上面已经提示我们可以通过 git reset HEAD <file> 撤销unstage状态
# shell $> git reset HEAD readme.md
Unstaged changes after reset:
M	readme.md

## 此时表示从暂存区取消 git add 操作, 但是我们的修改还是存在的.
# shell $> cat readme.me
git test
git new line
git add readme line

## 要想把这个修改撤销掉, 那就只要参考前面的 git checkout -- readme.md 操作
# shell $> git checkout -- readme.md

## 再次查看文件内容, 会发现刚刚的修改已经撤销了
# shell $> cat readme.md
git test
git new line

## 上面的命令也可以合并为一个命令来执行,不需要先 `git reset` 再 `git checkout`
# shell $> git reset --hard

## 可以一步到位地把你的修改完全恢复到未修改的状态

12. 修改文件后, 已经 git add 并且 git commit, 但是还没有 git push 推送到远程, 怎么撤销

# shell $> git reset --hard origin/master

这里 origin/master 表示回退到远程的master分支状态

13. 修改文件后, 已推送到远程, 怎么撤销

假如你既git add了,又git commit了,并且还git push了,此时你的代码已经进入远程仓库。如果想恢复的话,你只需要先恢复本地仓库,再强制push到远程仓库就可以了. 因为你的本地仓库和远程仓库是等价的.

# shell $> git reset --hard HEAD^
# shell $> git push -f

14. 删除版本库里的一个文件

首先, 先在版本库里新增一个文件

# shell $> echo "new file" > new.txt

# shell $> git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	new.txt

nothing added to commit but untracked files present (use "git add" to track)

# shell $> git add new.txt

# shell $> git commit -m "add new file"
[master 0bd592b] add new file
 1 file changed, 1 insertion(+)
 create mode 100644 new.txt

然后, 我们尝试删除

# shell $> rm new.txt

# shell $> git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	deleted:    new.txt

no changes added to commit (use "git add" and/or "git commit -a")

此时, 提示我们文件被删除了, 但是版本库里还有这个文件, 要从版本库里删除, 应该使用如下命令

# shell $> git rm new.txt
rm 'new.txt'

# shell $> git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	deleted:    new.txt

# shell $> git commit -m "delete some file"
[master dd13a7a] delete some file
 1 file changed, 1 deletion(-)
 delete mode 100644 new.txt

原文地址

https://www.liaoyongfu.com/2018/08/abfffa50-9606-11e8-9ecc-8b8cfce6aad6/

评论