git是分布式版本控制系统git
集中式与分布式:集中式有一个中央服务器,须要联网进行操做。分布式,每一个人都有一个版本库github
下载git->安装完成后找到git bash,打开是一个命令行(说明安装成功)bash
在命令行输入如下服务器
引号内部填本身信息 $ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
版本库又名仓库,英文名repository
app
git有三个区,工做区,暂存区,版本库。工做区add以后就进入了暂存区,暂存区的文件commit以后进入版本库ssh
注:如下文件名都带后缀分布式
git add "文件名"
注意:提交是将暂存区的文件都提交到版本库里fetch
git commit -m "操做名称"
git status
cat "文件名"
git log
如:commit后接的就是版本号,随机生成的命令行
commit 980993de744a8886692ed79fc7f4cdd00ec15959 (HEAD -> master) Author: zouyou <> Date: Sat Apr 11 14:35:04 2020 +0800 update commit commit ea799348f2b1ccc7d046f8bd61c6b193b79bdc18 Author: zouyou <> Date: Sat Apr 11 14:33:07 2020 +0800 git tracks changes
- 回退版本:3d
git reset --hard HEAD^ HEAD^:上个版本 HEAD^^:上上版本
git reset --hard ea799348f
若是忘记了版本号,可使用reflog查看历史的变化,无论有没有回退
git reflog
git diff
git restore 文件名
git resore --staged 文件名
git rm 文件名
git checkout 文件名
$ git remote add origin (ssh码)/(hhtps)
$ git push -u origin master
注:因为远程库是空的,咱们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在之后的推送或者拉取时就能够简化命令。
上传完成以后,只要本地进行了commit,就能够经过如下命令
git push origin master //这里与上面是差很少同样的语法
总结:要关联一个远程库,首先在远程建立好一个库,记住SSH码,再进行链接 git remote add origin ssh码
上传:第一次上传时git push origin -u master
,以后就不用加-u
了 git push origin master
这些命令里面,origin其实就是远程仓库的名字,一般命名为origin
首先在github上找到一个仓库再复制其ssh码,在git bash上输入命令行
git clone ssh码
注意:在哪一个文件夹打开的git bash就克隆到哪一个文件夹下面。
分支能够实现相似于开发版系统,完成以后再推送到主干,就是稳定系统。以下,两个分支合并到主干
在git中,master
分支是主干,一开始master
指向这根主线,head
指向master
,因此head
是充当一个指向当前点的指针,能够指向主干,也能够指向分支。
查看分支,显示全部分支,当前分支前会有*
git branch
建立一个分支dev
并切换到此分支 -b
的做用是建立并切换
git checkout -b dev 等价于 git branch dev //建立分支dev git checout dev // 切换到分支dev
注意:每个分支的工做区,暂存区,版本库都是独立的,切换分支以后,都会不同。
Git鼓励大量使用分支:
查看分支:git branch
建立分支:git branch
切换分支:git checkout
或者git switch
建立+切换分支:git checkout -b
或者git switch -c
合并某分支到当前分支:git merge
删除分支:git branch -d
查看分支图:git log --graph
-- 文件冲突
出现这种状况,两个分支没法merge,必须手动解决。
$ git merge feature1 Auto-merging readme.txt CONFLICT (content): Merge conflict in readme.txt Automatic merge failed; fix conflicts and then commit the result.
git status
也能够显示冲突文件,在冲突文件里打开能够看到标记。
Git用<<<<<<<
,=======
,>>>>>>>
标记出不一样分支的内容
当正在分支dev上进行一个工做时,忽然要修复一个bug(如在主干上),因此须要先将dev正在进行的工做隐藏一下,先去把bug修复。Git还提供了一个stash
功能,能够把当前工做现场“储藏”起来,等之后恢复现场后继续工做:
git stash //能够将在暂存区的文件(还未提交)隐藏,使用status也看不到
能够查询stash里隐藏的东西
git stash //=>例如:stash@{0}: WIP on dev: f52c633 add merge
修复完master的bug以后,恢复dev的现场:
git stash aplly //对现场进行恢复,此时stash里还有,须要进一步 git stash drop //对stash里的东西删除 同时还能够从stash里一步步恢复:git stash apply stash@{0} 等价于一句话 git stash pop
注:因为dev原本就是master的分支,那么dev也可能存在主干刚刚修复的bug,因此git有个功能能够实现bug的修复复制。由此能够推出,能够在分支解决bug在主干复制便可
git cherry-pick <版本号> 这里的版本好就是刚刚在主干修复bug后commit以后的版本号
开发一个新feature,最好新建一个分支,相似于bug分支;
若是要丢弃一个没有被合并过的分支,能够经过git branch -D
强行删除。
要查看远程库的信息,用
git remote //一般远程库是origin
也能够用git remote -v
,能够返回抓取和推送的地址,以下
origin https://github.com/zy116/first-blog.git (fetch) origin https://github.com/zy116/first-blog.git (push)
-- 推送分支
git push origin dev //推送分支 git push origin master //推送主干
可是,并非必定要把本地分支往远程推送,那么,哪些分支须要推送,哪些不须要呢?
master
分支是主分支,所以要时刻与远程同步;dev
分支是开发分支,团队全部成员都须要在上面工做,因此也须要与远程同步;总之,就是在Git中,分支彻底能够在本地本身藏着玩,是否推送,视你的心情而定!
-- 抓取分支
一般都会在master
和dev
分支分别推送各自的更改,当一我的把本身的分支都推送上去以后,另外一我的克隆下来的只能看到master分支,若是要在dev
分支上开发,必须创建一个远程分支到本地
git switch -c dev origin/dev
当另外一我的推送上了一个东西后,你也要推送,此时就会发生矛盾。另外一我的的最新提交和你试图推送的提交有冲突。
此时会提示你进行git pull
操做,可是会提示错误。
须要指定本地dev
分支与远程origin/dev
分支的连接,设置dev
和origin/dev
的连接
git branch --set-upstream-to=origin dev
再进行pull
git pull
这时候pull成功,会在冲突文件里标注,须要手动解决
所以,多人协做的工做模式一般是这样:
git push origin <branch>
推送本身的修改;git pull
试图合并;git push origin
推送就能成功!若是git pull
提示no tracking information
,则说明本地分支和远程分支的连接关系没有建立,用命令git branch --set-upstream-to origin/
。
小结:
git remote -v
;git push origin branch-name
,若是推送失败,先用git pull
抓取远程的新提交;git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致;git branch --set-upstream branch-name origin/branch-name
;git pull
,若是有冲突,要先处理冲突。