git自学1: git使用基础篇
2018-08-02 15:38
148 查看
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