
Git学习笔记
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 | ###-m后加简要描述 |
如果之前没有配置用户信息(也就是计算机不知道你是谁),这里提交会出现一个错误。所以先要配置一下,让计算机知道你是谁:
5.git config
1 | git config --global user.name "username" |
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 | git reset HEAD . |
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 | #将远程主机origin的master分支的最新更新拉到本地 |
从上面也可以看出,git pull
实际上是将上述步骤合并了。git fetch
更安全一点