Git基本操作(Windows)
创建版本库
通过git init
命令把这个目录变成Git可以管理的仓库,当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的,不能乱改和删除。比如这个目录地址为/Users/michael/learngit
。
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
把文件添加到版本库
- 使用命令
git add <file>
,注意,可反复多次使用,添加多个文件; - 使用命令
git commit -m "提交的内容"
,完成。
版本回退
- 查看日志:
git log
命令显示从最近到最远的提交日志,如果嫌输出信息太多,可以加上–pretty=oneline参数:git log --pretty=oneline
- 回退到上一个版本:
git reset --hard HEAD^
- 回退到指定版本:
git reset --hard commit_id
,commit_id也就是git log
命令查看出的前面一大串,比如:$ git log --pretty=oneline 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL e475afc93c209a690c39c13a46716e8fa000c366 add distributed eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
中的1094adb…,版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
git reflog
记录每一次操作的命令
工作区和暂存区
用git add
实际上就是把文件修改添加到暂存区;
用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
用git status
可以查看状态
撤销修改
git checkout -- readme.txt
:意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。
git reset HEAD <file>
:可以把暂存区的修改撤销掉(unstage),重新放回工作区。git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。
总结:
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,需要版本回退,不过前提是没有推送到远程库。
删除文件
命令git rm
用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
添加远程仓库
- 现在码云或者GitHub上建立一个远程仓库,比如在GitHub建立一个
learngit
仓库。 - 在本地的
learngit
仓库下运行命令:git remote add origin git@github.com:GitHub账户名/learngit.git
- 把本地库的所有内容推送到远程库上:
git push -u origin master
。把本地库的内容推送到远程,用git push
命令,实际上是把当前分支master
推送到远程。由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。 - 从现在起,只要本地作了提交,就可以通过命令:
git push origin master
从远程仓库克隆
git clone git@github.com:GitHub账户名/GitHub仓库名.git
创建于合并分支
- 查看分支:
git branch
- 创建分支:
git branch <name>
- 切换分支:
git checkout <name>
- 创建+切换分支:
git checkout -b <name>
- 合并某分支到当前分支:
git merge <name>
,通常,合并分支时,如果可能,Git会用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用Fast forward
模式,Git就会在merge
时生成一个新的commit
,这样,从分支历史上就可以看出分支信息。--no-ff
参数,表示禁用Fast forward
:git merge --no-ff -m "merge with no-ff" dev
- 删除分支:
git branch -d <name>
解决冲突
当当前分支和想合并的分支都有自己的提交内容时,Git无法进行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突。解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。用git log --graph
命令可以看到分支合并图。
文章借鉴自廖雪峰的官方网站