以下命令需在命令行下执行
文中只涉及了单用户的版本控制,关于多用户协作并未提及,以后可能进一步更新
安装
下载链接Git
windows和linux均可直接下载对应软件包傻瓜式安装,下一步–>下一步—>完成
ubuntu下可使用命令
sudo apt-get install git
- 1
全局设置
设置用户名
git config --global user.name "username"
- 1
设置用户邮箱
git config --global user.email "[email protected]"
- 1
设置完可以使用下面两个命令查看用户名和用户邮箱:
git config user.name
git config user.email
- 1
- 2
仓库初始化
git init
- 1
初始化之后会在当前目录下创建一个.git文件夹是隐藏文件夹。
状态查看
git status
- 1
查看当前文档中已跟踪的和未跟踪的文件。可见文件夹下有一个未被跟踪的文件exper.py。文件修改后也可以在版本库中看到状态。文件修改与否对比的节点是上一次提交的文件。
下面这张图片是对exper.py进行修改后的status,可以看到显示exper.py已经修改但是并未提交
git status -s
- 1
简略的查看状态。M是modified的缩写,当文件只修改未使用git add
添加时M是红色,表示文件不可提交,添加之后未浅色表示可以提交。最后一个图片的意思是使用git add
添加文件后又进行了修改并未添加。
跟踪文件
git add [filename]
- 1
跟踪文件,filename是你要跟踪的文件的文件名。可以通过git status
查看状态可以看到没有未跟踪的文件了。当文件修改后也应当用git add [filename]
讲文件更新文件到版本库。
提交
git commit -m "description"
- 1
提交文件修改到版本库”description”为你这次提交的具体描述。当文件修改结束后就应当提交。
git commit --amend --no-edit
- 1
将当前状态提交到以前的提交中,amend就是修补的意思,可以理解为完善以前的commit并不添加新的提交。图片中现实的三个提交都是之前的提交内容。但明显可以看到diff status对应的提交ID变了。(no-edit就是指不改变descripation)
提交状态查看
git log
- 1
查看以前提交的状态信息。可以看到提交人的信息:用户名和邮箱、提交时间、提交的描述,commit后面的一长串序列可以看做每次提交的ID号,可以唯一的找到对应的提交。
第二张图片是又进行了一次提交的结果
使用下面的命令简单的查看所有提交
git log --oneline
- 1
除了git log
还可以使用下面的命令查看以前所有的提交的记录
git reflog
- 1
git log --oneline --graph
- 1
分支以图形化的方式显示。分支后面讲。
查看修改内容
git diff
- 1
查看修改的内容
第一张图片是修改前的文件内容
第二张图片是修改后的内容
下面是使用git diff
后的结果+
的意思是添加了改行-
意思是删除了改行;我们是修改a=1
为a=2
等同于删一行又加一行。另外使用git add
添加之后的文件不会进行对比。
下面的文件又进行了修改并使用git add
加入到了版本库。
对于已添加未提交的文件可以使用下面的命令查看
git diff --cached
- 1
下面又在文件中添加一行,并不添加到版本库,那么使用git diff
看到的就上和上一次添加对比的结果
可以使用下面的命令查看与上次提交的文件对比的结果
git diff HEAD
- 1
修改文件状态
git reset [filename]
- 1
当使用git add
添加文件但未提交也可以使用上述命令将文件恢复到未添加的状态。
git reset --hard HEAD
- 1
使用上述命令可以讲已经添加但未提交的文件恢复到修改前的状态。可以看到之前做的修改已经不存在了。(之前我在文本末尾添加了一行int dd=dd;)
git reset --hard HEAD^
- 1
回到上一个提交的状态,0个^表示回到当前commit,一个^表示回到上一个commit,以此类推
git reset --hard HEAD~n
- 1
回到前n个commit,n为你向指定的commit的相对位置可取0,1,2,3,4…
git reset --hard [COMMIT_ID]
- 1
COMMIT_ID是每次提交时所赋予的ID号,可以通过git log
查看。COMMIT_ID基本上使用git log
中的七位ID号就可以
从图中可以看到exper.py的内容已经改变了。但这并不意味着之前做的几次提交消失了,可以用上面提到的’git reflog’命令查看以前的提交然后得到COMMIT_ID
也可以使用指针进行定位HEAD@{1}就是使用git reflog
查找到的指针
git reset --hard HEAD@{1}
- 1
回溯单个文件
git checkout COMMIT_ID -- [filename]
- 1
上面讲到的git reset
是将所有文件回退到指定的提交。这个命令只是将单个文件回退到指定的提交。
checkout也可以用来切换分支,分支在下面讲
git checkout [branche-name]
- 1
checkout创建分支同时切换到该分支
git checkout -b [branch-name]
- 1
分支
分支可以理解为开发的不同路径,不同分支不互相影响是互相独立的
新建分支
git branch [branch-name]
- 1
查看分支 *表示当前正所在的分支;master为主分支
git branch
- 1
git checkout [branch-name]的结果
删除分支
git branch -d [branch-name]
- 1
例如,现在我在master分支文件内容是
现在切换到develop分支对文件进行修改
现在来看master分支中的内容和之前的一样
合并分支
git merge --no-ff -m [descripation] [branch-name]
- 1
将当前分支合并到主分支
下面两个图片为当前两个分支master和develop中exper.py的内容
下面是合并后的结果
合并冲突解决
比如现在我们有一个master分支,又新建了一个dev分支master和dev分支都进行了相应的修改,现在他们的状态就是下面这种:
master--->commit1--->
\
(dev)\---->commit2--->
- 1
- 2
- 3
如果此时要进行合并就会冲突。
下面是master和dev两个分支上的文件
如果直接进行合并就会提示冲突
但是可以看到git已经讲两个文件合并现在要做的就是手动将不同的文件部分进行合并,就在<<<<<<<<< HEAD和>>>>>>>>>dev之间
另一种合并是通过rebase合并。
例如当前两个分支,都是来自于同一个commit,但都进行了相应的修改与提交。如下图:
下面是master的提交情况和文件内容
下面是分支rebaseuse的提交情况和文件内容
现在使用如下命令进行合并
git rebase [branch-name]
- 1
下面是使用之后的结果可以看到文件存在冲突因此需要我们手动进行合并,文件内容格式和使用git merge
类似。并且合并后会发现出现了一个新的分支。这就意味着我们的修改是在这一新分支上的,合并到master的工作之后会进行。
然后需要做的就是在这个新分支下手动合并文件然后使用下面的命令合并,注意在修改完后只需要将文件添加即可即使用git add
不需要提交。
git rebase --continue
- 1
另外需要注意的是上次提交的master commit file并未修改而rebaseuse分支的commit file修改插到了之前。如果讲rebase的合并过程看做链表的插入可能会更好理解一点儿,git rebase [branch-name]
就是创建新的节点,git rebase --continue
就是删除两个分支共同起点和当前节点之间的节点然后将节点插入到链表中。(这里的commit未881e44a和之前的不一样是因为我这个过程中进行了一次提交)
暂存
git stash
- 1
这是修改后的文件还没有暂存mai是刚添加的,第二章图片是暂存后的状态
然后你就可以去做自己的工作,自己的工作完成后使用下面命令恢复。注意:如果你之前的工作都是在当前分支下完成,则会自动合并stash期间修改的文件内容和stash之前的文件内容。
git stash pop
- 1
gitub
链接gitub
先在gitub上创建一个版本库,过程如下:
1.点击New Repository按钮
2.按照顺序填写项目名称,描述等信息,最后点击Create Repository按钮
3.上面的红框中的就是gitub的版本库地址,可以按照下面的指示将远程版本库与本地关联
4.将本地库利用git push
推到远程库中即可
git push --all origin
- 1
将所有的分支推送到远程代码库