git应该是一项必须要掌握的工具.先简述它和SVN的区别
- SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了.
- Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上.既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了.
1. 配置文件
- 查看配置的方法
git config --list
- 用户名和邮箱地址的作用
- 用户名和邮箱地址是本地Git客户端的一个变量,不随git库而改变。
- 每次commit都会用用户名和邮箱纪录。
- github的contributions统计就是按邮箱来统计的。
- 查看用户名和邮箱地址:
git config user.name git config user.email
- 修改用户名和邮箱地址:
git config --global user.name "username" git config --global user.email "email"
2. 基本使用
-
git中文件的各个状态
- unstaged - git仓库中没有此文件的相关记录
- modified - git仓库中有这个文件的记录,并且此文件当前有改动
- staged - 追加,删除或修改的文件被暂时保存,这些追加,删除和修改并没有提交到git仓库 -------暂存区
- commited - 追加或修改的文件被提交到本地git仓库(git仓库中大部分都是这种文件,所以git status不显示这些文件)-----仓库
-
初始化一个仓库
git init
在当前文件夹下生成.git目录,完成初始化,此时此文件夹下的所有文件处于unstaged状态 -
追加文件
git add <filename>
文件变为staged状态,其他文件还是unstaged状态 -
提交到版本库
git commit -m "your_index"
-
管理修改
要随时掌握工作区的状态,使用git status
命令。
如果git status告诉你有文件被修改过,用git diff
可以查看修改内容。 -
撤销修改
- 放弃工作区的修改------让这个文件回到最近一次git commit或git add时的状态。已经添加到暂存区的执行后恢复到添加到暂存区的状态
git checkout -- file
- 将暂存区的修改撤销掉--------执行完后记得工作区的修改并未执行,应该继续按上一条命令修改工作区
git reset HEAD file
- 放弃工作区的修改------让这个文件回到最近一次git commit或git add时的状态。已经添加到暂存区的执行后恢复到添加到暂存区的状态
-
删除文件
- 误删了工作区的文件
git status
命令会立刻告诉你哪些文件被删除了,接着使用
git checkout -- filename git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原” - 确实要删除文件. 版本库中删除该文件,那就用命令删掉,并且git commit:
git rm <filename> git commit -m "your_index"
- 误删了工作区的文件
-
版本回退
- 回退回上一个版本
git reset --hard HEAD^
在Git中,用HEAD表示当前版本,也就是最新的提交3,上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100.
- 另一种方法是使用commit id. 使用命令 git log 查看历史记录 , 获取前面的一大串类似3628164...882e1e0的是commit id(版本号)
使用命令进行任意版本的切换
git reset --hard commit_id
- 注对于查询版本号:
穿梭前,用git log
可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog
查看命令历史,以便确定要回到未来的哪个版本
- 注对于查询版本号:
3. 远程仓库
- 测试环境ubuntu
由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以需要进行设置 - 创建SSHkey
- 第1步
ssh-keygen -t rsa -C "youremail@example.com"
此过程中一路回车,使用默认值可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
- 第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容: - 关联远程仓库
git remote add origin git@server-name:path/repo-name.git
- 推送至远程库
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来
git push -u origin master
从现在起,只要本地作了提交,就可以通过命令:
git push origin master
- 从远程库克隆
git clone git@server-name:path/repo-name.git
- 分支管理
- 查看和切换分支
git branch (查看所有的分支及当前处于哪个分支) git branch (查看所有的分支及当前处于哪个分支) git branch -v (查看所有的分支的详细信息) git branch --merged (查看已经合并的分支) git branch --no-merged (查看还没合并的分支) git checkout [branch-name] (切换到某个分支)
- 新建分支
git branch [branch-name] (新建一个分支) git checkout -b [branch-name] (创建+切换分支)
- 删除分支
git branch -d [branch-name] 或者 git branch -D [branch-name] (强制删除某个还未合并的分支)
- 远程分支管理
查看远程仓库:git remote -v
//查看你当前项目远程连接的是哪个仓库地址。
添加远程仓库:git remote add [name] [url]
删除远程仓库:git remote rm [name]
修改远程仓库:git remote set-url --push [name] [newUrl]
拉取远程仓库分支:git pull [remoteName] [localBranchName]
推送分支到远程仓库:git push [remoteName] [localBranchName]
git push origin newline (origin是我本地的远程仓库的名字,对远程仓库的称呼, newline是本地将提交到远程的分支的名字)
查看远程分支:git branch -r
- 删除远程分支命令
git push origin :remote_branch 或者 git push origin --delete remote_branch
- 合并分支
git merge [branch-name] git merge [branch-name]
ex. 将分支btest合并到主分支master
git checkout master git merge btest