Git基本命令

在学习基本命令前,有必要先了解git的3层结构和git文件的4种状态:

(一)三层结构

1.working directory:工作区;
2.staging index:暂存区;
3.git directory(Repository):版本库;

(二)四种状态

1.untracked:未被追踪;
2.modified:已修改的(工作区修改了某文件但是还没有添加到暂存区);
3.staged:已暂存的(添加到了暂存区但没有提交到版本库)
4.committed:已提交的(数据被安全的存储在本地库中)

1.git init

Git安装好后是不会对计算机内的所有文件进行版本控制的,需要对哪个文件夹进行版本控制,就要进入这个文件夹,用git init进行初始化
初始化后,文件夹内会出现一个.git的隐藏文件夹,git对该文件夹进行版本控制的信息就是储存在这个.git的隐藏文件夹内。反言之,这个文件夹内如果存在一个.git的隐藏文件夹,说明这个文件夹正在进行版本控制,是一个代码仓库。

2.git status

查看这个文件夹内的文件有没有被追踪。

3.git add

使用git status后,没有被追踪(untracked)的文件会显示红色,这时可以用git add将这些没有被追踪的文件加入追踪。git add 后这些文件会进入暂存区,显示待提交的状态(to be committed
当本地的文件很多时,用git add .将本地所有文件加入暂存区

4.git commit

将文件提交到本地版本库

1
2
###-m后加简要描述
git commit -m "my first commit"

如果之前没有配置用户信息(也就是计算机不知道你是谁),这里提交会出现一个错误。所以先要配置一下,让计算机知道你是谁:

5.git config

1
2
3
4
git config --global user.name "username"
git config --global user.email "*****@qq.com"
#配置完后,可用下面的命令查看:
git config --list

6.git log

配置完用户信息后,再用git commit就可以成功了,这时可用git log查看下提交信息
git log --oneline用以简要显示提交信息

7.关于modified文件

对于已修改的文件,使用git status可以看到是红色,已修改未暂存,这时可以用git add 将文件加入暂存区,之后用git commit -m 将暂存区的文件加入版本库
或者,直接用git commit -am将工作区中的文件一次性加入版本库

Git撤销操作

1.git commit –amend 替换掉上次的版本

当感觉到上一次提交的版本不够理想或有问题时,可以将上一次的提交版本撤回,重新提交,方法:
1.git add *** 将需要重新提交的文件加入暂存区
2.git commit --amend 撤回之前的版本,并将加入到暂存区内的文件重新提交,这里会进入编辑界面,可以对之前的描述进行修改,根据情况可以修改,也可以不修改
如果没有新提交文件到暂存区,单纯的使用git commit --amend 实际上就是对上一次的版本描述进行修改

2.git checkout –将已做的修改扔掉

如果对工作区内的文件进行了修改,发现修改得不对或是根本就是误操作,想要恢复工作区内的文件时,使用 git checkout -- filename 取消上次的修改
也可用 git checkout -- . 对工作区内的所有文件进行恢复

3.git reset HEAD filename 拉取最近一次提交到本地版本库中的文件到暂存区

当已将文件提交到暂存区时发现提交的不妥或有问题时,使用

1
git reset HEAD filename

将版本库中的这一文件恢复到暂存区,注意:这一操作并不改变工作区中的内容,想要恢复工作区内容要用git checkout -- filename

4.总结一下

如果想将工作区中的文件全部恢复,则使用以下命令:

1
2
git reset HEAD .
git checkout -- .

Git文件删除

1.常用删除

在git里面删除文件不像平常那么简单,delete掉就完了。如果只是简单地delete,只是把文件从工作区中删了,使用git status就会显示红色的提示,所以delete掉后,还要用git add . 这样才算把文件从暂存区中也删了。这是常用的删除。

2.git rm命令,将文件从工作区和暂存中同时删除

这个命令的作用:当修改了工作区中的文件,用这个命令进行删除时,会提示删不掉,要用git rm --cached 或是git rm -f进行删除,这时如果用git rm --cached 则会将该文件在暂存区中进行删除,但并不影响工作区;如果用git rm -f可以强制性地将该文件从工作区中和暂存区中进行删除。所以,这个命令实际上起到防止误删除的作用。

3.git mv命令,将文件在工作区中和暂存中同时重命名

使用这个命令,相当于执行了3个命令:
1.mv oldname newname
2.git rm oldname
3.git add newname

Git分支

1.git branch

使用git branch命令可以查看当期的分支,带“”的就表示当前分支
使用git branch branchname可以创建一个分支
使用git checkout branchname切换到另一分支
使用git branch -d branchname删除一个分支,*注意:不能删除当前分支!要删除当前分支,必须切换到另一分支

2.git 指针及分支

3.git merge合并分支

当前为master分支,想要合并上图的dev分支时,使用git merge branchname命令
当两个分支的文件存在区别时会合并失败,这时git会要求手动解决冲突

4.git diff比较

使用git diff比较工作区和暂存区的差异
使用git diff --staged 比较暂存区和版本库中的差异
使用git diff 版本号 版本号 比较同一分支不同版本的差异(版本号用git log查看,至少要复制7-8位),这一功能在版本回退时很有用
使用git diff 分支 分支 比较不同分支之间的差异

5.git stash暂存工作区中的修改

5.1当一个分支的工作区中的文件有修改,这时想切换到另一分支时会报错,提示要讲工作区的修改提交。这时可以使用git stash将工作区中的修改暂时封存起来,之后就可以切换分支了。
5.2如果想将封存的修改再拉回来,先使用git stash list查看下stash堆栈,看看stash了些什么
再用git stash apply stash@{n}将第n个修改拉回来
5.3另外,如果使用git stash pop stash@{n},也可以将第n个修改拉回来,同时将暂存的第n个修改从stash堆栈中删除

Git远程仓库

基本流程: 甲、乙两人协作开发一个项目,在服务器上创建一个远程仓库。之后:
1.甲将自己的代码push到远程仓库
2.乙将远程仓库的代码clone到本地进行修改,修改后再push到远程仓库
3.甲再将乙的修改从远程仓库pull回来,修改后再push到远程仓库,如此循环往复
以github为例说明:

1.git push

在github创建好一个仓库后,可以将本地代码push到github上的仓库的master分支
git push https://github.com/username/reponame.git master
注意;这里的仓库地址可以使用http地址,也可以用ssh地址,ssh地址的形式是:
git@github.com:username/reponame.git 使用ssh地址需要将本地生成的RSA公钥上传至github

2.git pull

同样,可以使用git pull https://github.com/username/reponame.git master将github仓库内的代码拉回到本地

3.git remote add

如果觉得每次输入地址一长串太麻烦,可以添加一个名字,如:
git remote add github git@github.com:username/reponame.git
添加完后可用使用git remote -v 查看当前都添加了哪些仓库名
接着,就可以简单使用git push github master进行推送了
如果使用了 git push -u github master ,那么今后就可以直接用git push 就可以了

4.git免密登录远程服务器

使用ssh-keygen生成RSA秘钥对后,使用ssh-copy-id username@hostname 直接将本地的公钥复制到hostname主机的authorizied keys中,实现免密登录

5.git fetch

git fetch 相当于是从远程获取最近的更新到本地,不会自动merge,比如:

1
2
3
4
5
6
#将远程主机origin的master分支的最新更新拉到本地
git fetch origin master
#比较两个分支间的差异
git diff origin/master
#将远程更新合并到本地
git merge origin/master

从上面也可以看出,git pull实际上是将上述步骤合并了。git fetch更安全一点