git学习笔记

参考链接

廖雪峰Git教程
Git常见问题

配置全局用户

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

【注意】git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

创建本地版本库

版本库又名仓库,可以理解成是一个目录,这个目录中的所有文件都被git管理起来。

  1. 创建空目录
λ mkdir dxf_test_git
λ cd dxf_test_git
λ pwd

>> C:\Users\IdeaProjects\dxf_test_git
  1. 将目录变成Git可以管理的仓库
λ git init

>> Initialized empty Git repository in C:\Users\IdeaProjects\dxf_test_git/.git/
  1. 将改动的文件添加到仓库
    在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
# 表示一个文件被改动,添加了两行内容。
  1. 查看仓库改动状态
λ 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
  1. 查看提交记录
λ 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,用十六进制表示。

  1. 版本回退
    在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命令返回新的版本。

  1. 撤销修改
    情况一:修改了文件,但是还没有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
  1. 删除文件
    情况一:误删
λ git checkout -- delete.txt

情况二:确实要删掉

λ git rm delete.txt
λ git commit -m "remove the delete.txt"

远程仓库

  1. 关联远程仓库
λ git remote add origin ssh://git@xxxxxxxx/LearnGit.git

远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

  1. 推送本地仓库内容
λ git push -u origin master

第一次推送master分支时,加上了-u参数,Git不但会把本地的分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

  1. 克隆远程库内容至本地
λ git clone ssh://git@xxxxxxxx/LearnGit.git
  1. 创建分支
λ 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中没有新添加的内容。

  1. 合并指定分支到当前
λ git merge dev

>>  Updating 1dbbb68..65677ed
    Fast-forward
    test.txt | 3 ++-
    1 file changed, 2 insertions(+), 1 deletion(-)
  1. 删除分支
 $ git branch -d dev
  1. 储藏分支
    在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(-)
  1. 查看远程库信息
λ git remote -v
  1. 建立本地分支和远程分支的关联
λ git branch --set-upstream branch-name origin/branch-name

你可能感兴趣的:(git学习笔记)