git命令

1.特点
(1)版本控制
多人同时开发代码,解决找回历史代码的问题
(2)分布式
同一个git仓库,可以分布到不同的机器上。(分布式:即使中央服务器挂掉了,个人电脑仍能工作;集中式不行)

2.基本操作

(1)创建版本库
git init
新建一目录。在这个目录下创建一版本库:git init
这样就能管理这个目录下的代码。

(2)使用
在版本库的目录下创建1文件code.txt
创建版本:
a. git add code.txt
b. git commit -m '版本1'
#-m后是 说明信息

查看版本创建的记录
git log
git log --pretty=oneline #只有一行
修改文件后 再次add和commit,然后查看,有了变化。
(新版本只记录相对于前一版本的变化,后一版本 依赖 前一版本)

(3)版本回退
有个HEAD指针指向最新的版本。HEAD的前一个版本就可以使用HEAD^来表示。前两个使用HEAD^^表示。
HEAD~1 可以表示前1个版本。HEAD~10 表示前10个版本。
git reset --head HEAD^ #回退到上一个版本

现在又想回到 版本2,(版本2没删),但用 HEAD 回不去了。
git reset --hard 版本编号 #只要有版本2 的版本编号就能回去。 (版本编号前几位就行)
但此时用 git log 找不到 版本2的版本号了, 要用:
git reflog #退出终端 也可以看到之前的 操作记录

(log是查看版本记录,reflog是查看操作记录)

(4)工作区与版本库
工作区:电脑中的目录,比如git_test目录,就是个工作区。编辑文件时,就在工作区里进行。
版本库:工作区里的隐藏目录.git,就是版本库。
版本库 里有个重要区域,就是 暂存区。
git add 就是把 文件的修改 添加到 版本库的暂存区 里。
git commit就是把 暂存区的修改 提交(所有的),创建一个 版本记录 。
创建一个版本记录之前,可以多次把 文件的修改 添加 到暂存区。最后一次提交,创建版本记录。

先在工作区做多个操作,
git status 查看工作区的信息(未添加和提交的) #是红色的
untracked files代表从来没有add过,git无法帮助管理。

git add 多个文件 (或者是目录)
add给暂存区后,再git status,是绿色的了
此时git commit就可以一次性的把所有修改提交创建一新的版本记录了
再git status ,就是干净的

(5)撤销修改
看git status 的提示
a.在工作区撤销
改完一个文件,想撤销修改(在工作去中,还没有add到暂存区 status是红色的)
git status里有提示
git restore 文件名 #丢弃工作区的改动
此时工作区也干净了。
b.在暂存区撤销
git restore --staged 文件名 取消暂存到工作区
git checkout -- 文件名 丢弃工作区的改动
git status 工作区是干净的,此时最开始的改动也没了
c.如果版本记录撤销
版本回退


(6)对比文件的不同
a.对比 工作区和某个版本中文件 的不同
git diff HEAD -- 文件名
没有-和+,表示两个文件都有的内容。
-代表HEAD版本多的内容
+代表工作区多的内容

b.对比两个版本之间的不同
git diff HEAD HEAD^ -- 文件名
-代表当前版本HEAD多的code
+代表上一版本HEAD^多的code
这个-、+前面有提示。(版本位置不同,-+也不同)

(7)删除文件
对文件的增删改都是在工作区的
git rm替换成git add
删除文件也是和之前一样 工作区---》暂存区----》版本记录。

小结:
创建版本仓库:
git init .git目录

版本创建
git add 文件或者目录
git commit -m '版本说明信息'

查看版本记录
git log

查看操作记录
git reflog

版本回退
git reset --hard HEAD^
或者 git reset --hard 版本序列号

工作区、暂存区和版本库
编辑、删除文件都在工作区
git add 是把工作区的修改放入暂存区
git commit是把暂存区的修改一次性做一次的版本记录

管理修改
git commit只会把暂存区的修改提交到版本记录中
撤销修改

直接丢弃工作区的改动:
git restore 文件名

修改已经加到暂存区,但没有commit
git restore --staged 文件名 #先撤销暂存
git checkout -- 文件名 #再丢弃工作区的改动

已经创建版本记录:
版本回退
对比文件的不同:

对比工作区和版本文件的不同:
git diff HEAD -- 文件名

对比两个版本之间的文本
git diff HEAD HEAD^ -- 文件名
(注意提示的+ -)

删除文件
也要添加暂存(git rm)在提交到版本记录中

注:创建完文件后要把文件放入到暂存区里去,否则做的修改不会知道。(这样git才会管理这个文件)


3.git分支
(1)原理
分支就是条流水线,互不干扰的。重合叫做分支的合并
git把我们之前每次提交的版本串成一条时间线,这条时间线就是一个分支。
主分支 master
HEAD严格来说不是指向当前版本,而是指向master,master指向版本。
当创建新分支时,例如dev时,git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上。
git创建一个分支很快,因为除了增加一个dev指针,改变HEAD的指向,工作区的文件都没有任何变化。
不过,创建分支后,对工作区的修改和提交就是针对dev分支了,dev指针改变,而master指针不变。
分支dev工作完成了,就可以把dev合并到master上。直接把master从原来位置移到dev的位置。
合并之后,可以删除分支

(2)基本操作
git branch
查看当前有几个分支,并且看到在哪个分支下工作

git checkout -b dev
创建一个分支dev并切换到其上进行工作 ----》创建并切换:创建一个dev指针,切换指让HEAD指向dev---》很快
这个分支里面,之前的master的记录都有。
然后再修改提交等操作

git checkout master
切换回master

git merger
合并分支(快速合并)---》把master指针往dev一挪
有些时候不能快速合并

git branch -d dev
删除dev分支

(3)合并冲突
先创建一分支并切换 git checkout -b dev
修改再提交
切换回主分支 git chekout master
主分支这是没有合并,而是也修改提交了。
这样分支和主分支合并(快速合并时)就出现冲突。 git merge dev

解决方式:
手动解决
在文本中有三行的提示信息,表示是哪个分支的
手动清除,给多余的行数删掉。
在add和commit就行了。
在两个分支上都有了新的提交,并且修改的是同一个文件---》就会产生冲突。a

git log --graph --pretty=oneline 查看分支的图

(4)分支管理策略
通常,合并分支时,git会用快速合并的模式;有时快速合并不能成功而且合并时没有冲突,这个时候git会帮我们合并之后做一次新的提交。

要输入一个合并的信息。
ctrl+x退出

如果要强制禁用快速合并(fast forward)模式,git就会在合并merge的时候生成一个新的提交commit,这样,从历史分支上就可以看出分支信息了。
禁用快速合并:
git merge --no--ff -m '说明信息' dev

(5)bug分支
每个bug需要一个临时分支来进行修复,修复之后再合并分支,删掉临时分支。

git提供stash功能,可以把当前工作现场“存储”起来,等以后恢复现场后继续工作。
stash后工作区是干净的。可以切换到其他分支,做其他的bug。
为保存修复bug的分支的历史记录,要禁止快速合并。合并之后有一次新的提交。(删除了分支也有历史记录)
修复完bug,就可以到之前存储的那个分支去工作。
git stash list 列出保存的工作现场
git stash pop 恢复现场

注意:
出现bug时,会通过创建新的bug分支进行修复,然后合并(禁止快速合并),最后删除。
当手头工作还没有完成时,先把工作现场保存git stash,然后去修改bug,修复后,再git stash pop去恢复工作现场。

(6)小结:
分支概念:
相当于工厂的流水线;分支之间互不影响
基本操作命令:
  查看
  创建
  切换
  创建并切换
  合并
  删除
分支合并冲突:
两个分支都有了新的提交记录,并且修改的是同一个文件,就会起冲突。
解决冲突:
  手动处理,并提交
分支管理策略:
  合并时默认执行快速合并
  有些时候需要禁止快速合并,加上--no--ff

bug分支:
修复bug之前保存工作现场,用git stash
切换到bug所在分支,并创建切换到一临时分支(修复bug),修复完后切换回bug所在分支,并合并临时分支的内容(禁止快速合并),删除临时分支
切换回工作分支,恢复工作现场 git stash pop


4.github
(1)创建仓库
文件.py,但在运行时会产生.pyc,和项目代码没有关系。但是如果有这个文件git会提示该文件没有别跟踪,管理
不想让git管理这些.pyc这些文件,就在目录下添加.gitignore文件。(创建仓库时可选择的) 选python

(2)添加ssh账户
创建好仓库后,经常要使用自己的电脑和github交互。交互之前需要把自己的ssh账户添加到
github的账户里面。

头像的settings有个SSH and GPG keys,点进去,随便起名字,拷贝自己电脑的ssh公钥

生成自己电脑上的ssh公钥。
在git上的用户名和邮箱改为github上的
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
生成ssh密钥
ssh-keygen -t rsa -C "邮箱地址"

id_rsa是私钥 自己保留
id_rsa.pub是公钥,把其添加到github上

(3)克隆项目
克隆时地址选择ssh的,不要https的,因为有ssh公钥.
git clone ssh克隆地址 ---》先切换到单独的目录下

(4)推送代码
开发
通常开发不在master上开发,而是创建一个自己的分支。
git branch
git checkout -b yq
每天在自己的分支上开发。

几天开发结束后,在本地做个提交
git add
git commit -m 一个版本

推送:
git push origin 分支名称(yq) #origin代表远程的分支,即github

(5)跟踪远程
git branch --set-upstream-to=origin/yq yq 让本地的yq分支跟踪远程的yq分支
再git status就会告诉与上游分支的区别
当跟踪远程时,自己这有改变,提交到本地仓库后,
可以直接git push,不用写后面的origin等内容

(6)拉取代码
git pull origin 分支名称
会下载远端分支并且合并本地所在的分支。

原文地址:https://www.cnblogs.com/yq055783/p/13054371.html