参考链接
廖雪峰Git教程
Git常见问题
配置全局用户
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
【注意】git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
创建本地版本库
版本库又名仓库,可以理解成是一个目录,这个目录中的所有文件都被git管理起来。
- 创建空目录
λ mkdir dxf_test_git
λ cd dxf_test_git
λ pwd
>> C:\Users\IdeaProjects\dxf_test_git
- 将目录变成Git可以管理的仓库
λ git init
>> Initialized empty Git repository in C:\Users\IdeaProjects\dxf_test_git/.git/
- 将改动的文件添加到仓库
在dxf_test_git目录下新建一个test.txt文件,并添加两行内容,然后将改动添加至仓库。
# git add testfile 添加改动的文件,git add . 添加所有改动的文件
# git commit -m “……” 提交改动信息,引号中为改动提示,便于查找
λ git add test.txt
λ git commit -m "wrote a readme file"
>> 1 file changed, 2 insertions(+)
create mode 100644 test.txt
# 表示一个文件被改动,添加了两行内容。
- 查看仓库改动状态
λ git status
>> 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: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
git status命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,test.txt被修改过了,但还没有准备提交的修改。用git diff这个命令看看,可以看到具体修改了什么内容。
λ git diff
>> diff --git a/test.txt b/test.txt
index d8036c1..d55a7b6 100644
--- a/test.txt
+++ b/test.txt
@@ -1,2 +1,4 @@
Git is a version control system.
+Git is free software.
+Git is a distributed version control system.
Git is free software.
\ No newline at end of file
- 查看提交记录
λ git log
>> commit 9857b0eb859740cb7846a5b9f8bb4ef2fd849b76 (HEAD -> master)
Author: MyName
Date: Mon Aug 19 16:42:38 2019 +0800
This is a test file
commit 05e0a6a03c1c29ccdbf5393483a5e21a65a359d8
Author: MyName
Date: Mon Aug 19 14:54:41 2019 +0800
write a test file
git log命令显示从最近到最远的提交日志,如果嫌信息太多,可以试试加上--pretty=oneline参数:
λ git log --pretty=oneline
>> 9857b0eb859740cb7846a5b9f8bb4ef2fd849b76 (HEAD -> master) This is a test file
05e0a6a03c1c29ccdbf5393483a5e21a65a359d8 write a test file
"9857b0……"是Git的commit id,用十六进制表示。
- 版本回退
在Git中,用HEAD表示当前版本,也就是最新的提交"9857b0……"(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD,上上一个版本就是HEAD^,HEAD~100表示前第100个版本。
λ git reset --hard HEAD^
>> More?
More?
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.Use '--' to separate paths from revisions, like this:'git [...] -- [...]'
# 回退失败:由于windows中^是特殊字符,因此要加引号
λ git reset --hard HEAD‘^’
>> HEAD is now at 05e0a6a write a test file
当你回退到了某个版本,又后悔了,想恢复到新版本却找不到新版本的commit id时,可以用git reflog查看每一次命令。
λ git reflog
>> 05e0a6a (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
9857b0e HEAD@{1}: commit: This is a test file
05e0a6a (HEAD -> master) HEAD@{2}: commit (initial): write a test file
由此可知,新版本的id是9857b0e,可以用λ git reset --hard 9857b0e命令返回新的版本。
- 撤销修改
情况一:修改了文件,但是还没有add,可以用git checkout -- file命令清除工作区的修改。注意,--很重要,没有--,就变成了“切换到另一个分支”的命令。
λ git status
>> 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: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
λ git checkout -- test.txt
λ git status
>> On branch master
nothing to commit, working tree clean
情况二:修改了文件,并且已经add,但是还没有commit。可以用git reset HEAD file命令把暂存区的修改撤销掉(unstage),重新放回工作区,再用git checkout -- file命令清除工作区。
λ git reset HEAD test.txt
>> Unstaged changes after reset:
M test.txt
λ git checkout -- test.txt
- 删除文件
情况一:误删
λ git checkout -- delete.txt
情况二:确实要删掉
λ git rm delete.txt
λ git commit -m "remove the delete.txt"
远程仓库
- 关联远程仓库
λ git remote add origin ssh://git@xxxxxxxx/LearnGit.git
远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
- 推送本地仓库内容
λ git push -u origin master
第一次推送master分支时,加上了-u参数,Git不但会把本地的分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
- 克隆远程库内容至本地
λ git clone ssh://git@xxxxxxxx/LearnGit.git
- 创建分支
λ git checkout -b dev
-b表示创建并切换分支,相当于以下两条命令:
λ git branch dev
λ git checkout dev
用git branch命令查看当前分支。git branch命令会列出所有分支,当前分支前面会标一个*号。
λ git branch
* dev
master
然后,我们就可以在dev分支上正常提交,比如对test.txt做个修改。此时,如果再将分支切换回master,会发现test.txt中没有新添加的内容。
- 合并指定分支到当前
λ git merge dev
>> Updating 1dbbb68..65677ed
Fast-forward
test.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
- 删除分支
$ git branch -d dev
- 储藏分支
在dev分区下工作,工作只进行到一半,还没法提交,但必须马上解决一个bug,可以利用stash功能把当前工作现场“储藏”起来,等以后恢复现场后继续工作,另外创建issue分支来修复bug。
# on branch dev
λ git stash
# 返回master分支,在master分支上创建新的issue分支用来解决bug,合并master分支,并删除issue分支
# 回到dev分支
λ git stash list
λ git stash apply
λ git stash drop
λ git stash pop
可以多次stash,恢复的时候,先用git stash list查看,然后用命令git stash apply stash@{0}恢复指定的stash。
同样的bug,要在dev上修复,我们只需要把fix bug 101这个提交所做的修改“复制”到dev分支。注意:我们只复制fix bug 101这个提交所做的修改,并不是把整个master分支merge过来。Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支。
λ git branch
* dev
maste
# 4c805e2是fix bug 101这个提交的id
λ git cherry-pick 4c805e2
[master 1d4b803] fix bug 101
1 file changed, 1 insertion(+), 1 deletion(-)
- 查看远程库信息
λ git remote -v
- 建立本地分支和远程分支的关联
λ git branch --set-upstream branch-name origin/branch-name