前言
git
由Linus(linux之父)使用c
预言开发git
为分布式版本控制系统
安装与配置
安装
教程就网上找咯…
配置
安装后需要配置git账号和密码
// 这里设置的是全局账号和邮箱
$ git config --global user.name "username"
$ git config --global user.email "email"
查看git项目配置的全局配置
$ git config --list
生成密钥
$ ssh-keygen -t rsa -f ~/.ssh/id_rsa_x -C "email"
测试是否联通
$ ssh -T git@github.com
git 添加多个远程账号
参考链接:git添加多个远程账号
创建版本库(本地仓库)
- 选择一个合适的地方,创建一个空目录,创建的版本库(仓库)位于/Users/workspace/codes/personal
$ mkdir personal
$ cd personal
$ pwd
/Users/workspace/codes/personal
- 通过
git init
命令把这个目录变成Git可以管理的仓库
$ git init
Initialized empty Git repository in /Users/workspace/codes/personal/.git/
$ ls -ah
. .. .git
仓库建好了,是一个空的仓库(empty Git repository)。当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
配置远程仓库
步骤:
step1:创建SSH Key
- 在用户主目录下查看是否有
.ssh
目录,这个目录下是否有id_rsa
和id_rsa.pub
这两个文件。若有,next step,please
。
$ cd //进入用户主目录
$ ls -a //查看隐藏目录
.ssh
$ cd .ssh/
id_rsa id_rsa.pub
- 如果没有以上目录和文件,则直接在终端创建
SSH Key
$ ssh-keygen -t rsa -C "youremail@example.com"
step2: 配置远程仓库SSH Key
本地仓库关联远程仓库
$ git remote add origin git@server-name:path/repo-name.git
然后可以使用git push -u origin master
第一次推送master分支的所有内容
每次本地提交后,只要有必要,就可以使用命令git push origin master
推送最新修改
git常用操作
把文件添加到版本库(本地仓库)
工作区与版本库
- 工作区:就是你创建git仓库的那个目录
- 版本库:工作区隐藏目录
.git
提交步骤:
- 用命令
git add <file>
告诉Git,把文件添加到仓库:(将文件修改提交至缓存区)
$ git add readme.txt
- 用命令
git commit -m <message>
告诉Git,把文件提交到仓库(将缓存区文件提交至仓库)
// -m后面输入的是本次提交的说明
$ git commit -m "wrote a readme file"
[master (root-commit) eaadf4e] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
查看工作区状态
git status
查看git仓库当前状态
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
deleted: readme.tx
no changes added to commit (use "git add" and/or "git commit -a")
如果git status
告诉你有文件被修改过,用git diff
可以查看修改内容
版本回退
- 使用
git log
命令查看历史提交记录 - 使用
git reset --hard <head>
回退到指定版本,head
为commit id
版本号,可写前几位 - 使用
git reflog
查看命令历史,借此也可找回回退版本到commit id
撤销修改
git checkout -- readme.txt
,把readme.txt文件在工作区的修改全部撤销,有两种情况:
-
readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态(回到最近一次
git commit
状态) -
readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。(回到最近一次
git add
状态)
git reset HEAD <file>
把暂存区的修改撤销掉(unstage),重新放回工作区(跟没修改差不多了…)
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
如果改乱的多不如就直接版本回退了吧。。。
删除文件
确实需要删除文件:
- 删除工作区文件:
rm <file>
- 删除版本库文件:
git rm <file>
(实际已经将修改提交至暂存区了) - 提交修改至工作区:
git commit -m <message>
- done
误删除文件,恢复:
git checkout --<file>
实际就是前面的版本回退
查看当前分支
$ git branch
创建分支
-
git branch
命令创建分支 -
git checkout -b <branch>
命令加上-b
参数表示创建并切换,相当于以下两条命令$ git branch <branch> $ git checkout <branch>
-
git switch -c <branch>
命令加上-b
参数表示创建并切换
切换分支
$ git check <branch>
$ git switch <branch>
合并分支
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
合并指定分支至当前分支
$ git merge <branch>
删除分支
$ git branch -d <branch>
推送分支
该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
$ git push origin <branch>
如果推送失败,先用git pull
抓取远程的新提交
创建和拉取远程分支
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致
$ git checkout -b <branch> origin/master
获取最新提交
git fetch <origin> <branch>
将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中,需要自己merge本地分支git pull
=git fetch
+git merge
,有冲突自己先手动解决,提交后push再pull
$ git pull
git pull
失败,原因是没有指定本地dev
分支与远程origin/dev
分支的链接,根据提示,设置dev
和origin/dev
的链接:
$ git branch --set-upstream-to=origin/dev dev
然后git pull
如果合并有冲突,需要手动解决,解决的方法和分支管理中的解决冲突完全一样。解决后,提交,再push
查看标签 tag
查看所有标签
$ git tag
查看标签信息(按字母排序)
$ git show <tagname>
创建标签 tag
- 先切换到需要打标签的分支
- 然后使用
git tag <tagname>
创建标签
$ git tag <tagname>
- 使用
commit id
创建标签(先通过git log --pretty=oneline --abbrev-commit
获取commit id
)
$ git tag <tagname> <commit id>
- 创建带有说明的标签,用
-a
指定标签名,-m
指定说明文字
$ git tag -a <tagname> -m "describe" <commit id>
删除标签
$ git tag -d <tagname>
推送标签至远程仓库
- 推送某个标签
$ git push origin <tagname>
- 一次性推送所有标签
$ git push origin --tag
删除远程仓库标签
- 先删除本地仓库标签
$ git tag -d <tagname>
git push
删除远程仓库标签
$ git push origin:refs/tags/<tagname>
多人协作工作模式
- 首先,可以试图用
git push origin <branch-name>
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。