学习了廖雪峰老师的Git教程之后的命令总结,重点更新第十项关于git和远程仓库的东西。
如果没有学过,这是传送门
2021.02.19更新:第十章第12节--切换远程分支并拉取远程分支到本地,第十章第13节--git不用每次都要输入用户名密码
2021.03.09更新:第十章第11节--git配置多账户
2020.05.29更新:第六章第13节--删除commit信息
2020.05.28更新:第十五章--添加git常见错误及解决办法
2019.07.15更新:第六章第12节--修改commit信息
2019.07.13更新:第六章第11节--创建本地新分支并将新分支和远程某个分支相关联
2019.06.05更新:第十章第9节--添加fork别人的仓库后如何同原仓库保持同步更新
2019.05.25更新:第五章删除文件添加删除远端文件
2019.05.23更新:对一些命令添加了说明信息,添加了origin,对第四部分暂存区git stash命令内容进行更新,添加git checkout的说明,第六部分的合并远程分支添加具体命令,第八部分的第2节创建bug分支处添加具体命令,建议再全看一遍,修改的地方有点多
下面这个图很重要
大家可以将GitHub - JasonDu1993/gitskillfork到自己的github账号里面然后克隆下来进行尝试
一、git初始化本地仓库和配置
echo "想输入到文件的内容,一般为# 库名字" >> README.md
git init
如果没有配置需要配置
git config --list
git config --global user.email "abc@bupt.edu.cn"
git config --global user.name "xy"
git config --list
还可以配置git显示颜色
git config --global color.ui true
配置别名
git config --global alias.st status 使用git st 代替 git status
git config --global alias.co checkout 使用git co 代替 git checkout
git config --global alias.ci commit 使用git ci 代替 git commit
git config --global alias.br branch 使用git br 代替 git branch
有人丧心病狂地把lg配置成了:
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
二、提交文件
git status 查看当前仓库的状态
git diff file_name
git add file2.txt file3.txt 想添加所有的文件git add .
git status
git commit -m "提交记录文字“
git status
举例:
git commit -m "Fixes bug"
如果发现commit信息写错了,
git commit --amend -m "Fixes bug #42"
三、回退
1,查看commit信息和命令信息
git log(查看当前状态下的commit信息,不能查看以后的信息)
git reflog(查看所有的命令信息)
git reflog
git log -p --graph
通过 git pull更新后,会显示别人修改了哪些文件。此时你想要查看某个文件的具体修改的内容,可通过下面的命令去查看:
git log -p + 文件名 (可查看该文件以前每一次push的修改内容)
git log - p -1 + 文件名 (只查看该文件当前这一次的push内容)
git log --graph 看到分支合并图
git log --graph --pretty=oneline --abbrev-commit
2,回退
git reset --hard commit_id。除了--hard参数外,还有--soft,--mixed。
下面详细介绍这三个参数:
add表示add操作之后的结果
commit表示commit之后的结果
push:表示进行push操作之后的结果
(stash)表示在add前可能存在stash操作(即暂存工作区的操作)
假设某次提交过程如下
init--(stash1)--add1--commit1--push1--(stash2)--add2--commit2--push2--(stash3)--add3--commit3--push3
举例
--hard 回退到某个版本commit之前的状态 ,进行1,2,3操作。如现在在commit2,或者add2,可以回到commit3或者commit1
--soft 回退到某次commit前的stage状态(即处于暂存状态),进行1操作。如现在在commit2,可以回到add1,或者add3
--mixed回退到add前的状态(即处于工作区,如果有stash,需通过stash pop之后才能真的回到暂存的状态),执行1,2操作。如现在在commit2,可以回退到init--(stash1),或者commit1-push1--(stash2),或者
3,HEAD介绍
HEAD指向的版本就是当前版本,HEAD^,前一个版本,HEAD^^前两个,HEAD~100,前100个版本
4,查看远程log
git fetch --all 可以把远程的commit信息拉到本地更新到本部版本库的master HEAD指针上,然后利用git log和git reflog进行查看操作
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本,也可以用git reflog。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
建议都用git reflog
四、切换暂存区、工作区
git stash 暂存工作现场
git stash list 会出现stash@{0}: WIP on dev: 6224937 add mergegit
git stash pop 将暂存区的环境恢复到工作区
git stash list 此时暂存区已经没有数据了
git diff HEAD -- readme.txt 查看工作区和版本库里面最新版本的区别
git checkout -- readme.txt 把工作区的修改全部撤销,其中--不能省,否则就变成切换分支了。
git reset HEAD file_name 可以把暂存区的修改撤销掉(unstage),重新放回工作区
关于git checkout可以看一下这篇文章git checkout 命令详解 - 酷越 - 博客园
checkout命令用法如下:
1. git checkout [-q] [<commit>] [--] <paths> ...
2. git checkout [<branch>]
3. git checkout [-m] [ [-b | -- orphan ] <new_branch>] [start_point]
用法2比用法1的区别在于,用法1包含了路径。为了避免路径和引用(或提交ID)同名而发生冲突,可以在<paths>前用两个连续的连字符作为分隔。用法1的<commit>是可选项,如果省略,则相当于从暂存区进行检出。
五、删除文件
1,删除本地文件
git rm file_name
git commit -m "删除信息“
2,误删
git checkout -- test.txt 用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
3,删除远端文件
git rm -r --cached --force .idea/ 删除文件不需要加-r,删除文件夹需要-r, 该文件夹路径为本地文件夹所在路径
git commit -m "delete .idea/" 提交记录
git push origin master 推到远端
六、本地分支和远程分支
1,查看本地分支,带星号的表示当前所在本地分支
git branch
查看远程和本地分支
git branch -a
如果没有成功,先git fetch origin,然后我们在git branch -a
2,创建本地分支
git branch dev 创建分支
git checkout dev 切换分支(不要随意切分支,如果你在某个分支上面修改了一些东西,但没有stash,那么你切换分支后修改的东西就没有任何保存了,如果想切,请先git stash,然后git checkout dev)
stash后没有stash pop,然后reset --hard
git checkout -b dev 创建并切换分支也可以用于切换已有分支
3,创建远程分支
如果想把本地的test分支提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支。
git push origin test:master // 提交本地test分支作为远程的master分支
git push origin test:test // 提交本地test分支作为远程的test分支
也可以在github网站直接创建
直接在红色框位置输入想要创建的分支的名字,然后enter即可。
4,合并本地分支
git merge dev 合并当前分支,一般先切换到需要被合并的分支,如切换到master,该命令在master分支上输入会将dev分支合并到master分支
git merge --no-ff -m "merge with no-ff" dev --no-ff参数,表示禁用Fast forward,用普通模式合并,合并后的历史有分支,能看出来曾经做过合并。
merge和rebase的区别git merge 和 git rebase 小结_快乐&&平凡-CSDN博客_git merge和git rebase的区别
git merge b # 将b分支合并到当前分支
git rebase b,也是把 b分支合并到当前分支
假设目前分支:
5,origin
git学习:关于origin和master_tyyking的博客-CSDN博客_origin和master
git的服务器端(remote)端包含多个repository,每个repository可以理解为一个项目。而每个repository下有多个branch。"origin"就是指向某一个repository的指针。服务器端的"master"(强调服务器端是因为本地端也有master)就是指向某个repository的一个branch的指针。
这是服务器端(remote)的情况:
git remote add origin git@github.com:JasonDu1993/learngit.git 关联远程库,相当于让origin等于后面这个地址
6,git fetch 更新远程代码到本地仓库
git fetch 更新远程代码到本地仓库 - 圣耀 - 博客园
理解 fetch 的关键, 是理解 FETCH_HEAD,FETCH_HEAD指的是: 某个branch在服务器上的最新状态
当前分支指向的FETCH_HEAD, 就是这个文件第一行对应的那个分支.
一般来说, 存在两种情况:
1)如果没有显式的指定远程分支, 则远程分支的master将作为默认的FETCH_HEAD.
2)如果指定了远程分支, 就将这个远程分支作为FETCH_HEAD.
命令1:git fetch origin branch1
设定当前分支的 FETCH_HEAD' 为远程服务器的branch1分支`。这个操作是git pull origin branch1的第一步, 而对应的pull操作,并不会在本地创建新的branch。
同时这个命令还可以用来测试远程主机的远程分支branch1是否存在, 如果存在, 返回0, 如果不存在, 返回128, 抛出一个异常.
命令2:git fetch origin branch1:branch2
使用远程branch1分支在本地创建branch2(但不会切换到该分支),如果本地不存在branch2分支, 则会自动创建一个新的branch2分支,
如果本地存在branch2分支, 并且是`fast forward', 则自动合并两个分支, 否则, 会阻止以上操作.
7,fetch更新本地仓库两种方式
//方法一
git fetch origin master //从远程的origin仓库的master分支下载代码到本地的master分支
git log -p master origin/master //比较本地的仓库和远程仓库的区别
git merge origin/master //把远程下载下来的代码合并到本地仓库,远程的和本地的合并
//方法二
git fetch origin master:temp //从远程的origin仓库的master分支下载到本地并新建一个分支temp
git diff temp //比较本地master分支和本地temp分支的不同
git merge temp //合并本地temp分支到本地master分支
git branch -d temp //删除本地temp分支
8,合并远程分支
将远程分支b合并到远程分支a,思路为先把两个远程分支拉到本地,然后在a分支上操作,将b分支内容合并到a分支,最后把a分支内容推到远程
假设这两个远程分支是a和b,那么fetch a和b,checkout a,将b merge(rebase)到a,push a到远端。这样做,将b和a合到了一起,并且更新了本地和远端的a。如果b不需要了,可以删除远程b和本地b
git fetch origin a:a 将远程a分支拉到本地a(冒号后面的a表示本地分支a)
git fetch origin b:b 将远程b分支拉到本地b(冒号后面的b表示本地分支b)
git checkout a 切到本地a分支
git merge b 将本地b分支合并到本地a分支上
git push origin a 将本地a分支推到远程a分支
git branch -d b 删除本地分支
git push origin --delete b 删除远程b分支
9,删除本地分支
git branch -d dev 删除分支
10,删除远程分支
git push origin --delete dev
11,创建本地新分支并将新分支和远程某个分支相关联
git branch -a 查看本地和远程所有分支
git checkout -b dev origin/dev 创建本地分支dev并和远程dev分支相关联同时切换到本地dev分支
12,修改commit信息
(1)没有push到远端,修改本地分支commit信息
A,未执行git push 之前可以使用如下的命令进行操作(只能撤销最近一次的commit)
git reset --soft commit_id (commit_id可以git reflog查看)
git commit -m "fix commit" 重新提交信息
B,如果要修改前面多出提交的历史信息,可以采用(2)里面的方法,只是不需要执行git push
命令总结:
git checkout -b dev
git rebase -i HEAD~5
把需要修改的commit信息前的pick改成edit
git commit --amend
git rebase --continue
多次重复执行前面两个命令直到更新
(2) 已经push到远端 ,修改本地分支commit信息和远程分支commit信息
命令总结:
git checkout -b dev (切换到dev分支)
git rebase -i HEAD~5 (对最近5个提交记录进行rebase操作)
把需要修改的commit信息前的pick改成edit (linux下一般通过vim进行操作,即输入i进入编辑模式,修改对应内容,然后esc,接着输入:wq保存退出)
git commit --amend (输入i进入修改模式,修改commit信息,修改完后使用esc退出修改模式,接着输入:wq保存修改)
git rebase --continue
多次重复执行前面两个命令直到更新
git push origin dev -f
下面是详细介绍
git 如何修改已经push 的commit 的信息_zhaihoy的博客-CSDN博客_git 修改push信息 git 如何修改已经push 的commit 的信息
A,git rebase -i HEAD~5 最新提交的版本为倒数第一个版本,5表示倒数第5个版本,这个数字可以修改,如改成2
前5行即为HEAD~5所提交的信息,第一行为倒数第五个版本的commit信息,第五行为倒数第一个版本commit信息,每行开头未pick,然后未commit id, 然后时commit信息
B,输入i进入修改模式,将需要修改的commit信息前的pick改成edit,修改完后使用esc退出修改模式,接着输入:wq保存修改。
C,命令行输入git commit --amend,输入i进入修改模式,修改commit信息,修改完后使用esc退出修改模式,接着输入:wq保存修改。
【注】保存之后 git rebase --continue还没有使用之前还可以使用git commit --amend继续修改这条commit信息,但如果提交了就只能从头再来了,即使用git rebase -i HEAD~5 把pick改成edit保存退出,然后git commit --amend,保存修改信息之后屏幕输出以下内容
保存修改后命令行会输出以下内容
[detached HEAD fbe9591] 20190716c, bs 16, lr 0.001, maxiter 60000, steps "(50000, 55000)", 8000
Date: Mon Jul 15 18:11:43 2019 +0800
1 file changed, 3 insertions(+), 3 deletions(-)
D,命令行输入git rebase --continue
(py3) jason@jason:~/workspace/mask-detection$ git rebase --continue
Stopped at 896acbdf7545b0e42ff761376a2cdbca899b445d... 20190715c, bs 8, lr 0.0025, maxiter 60000, steps "(50000, 55000)", 8000
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
输出这些信息是因为我们把多个pick改成了edit,因此继续修改commit信息直到全部修改完成,如下所示
(py3) jason@jason:~/workspace/mask-detection$ git commit --amend
[detached HEAD 70929e1] 20190715e, bs 8, lr 0.0025, maxiter 60000, steps "(50000, 55000)", 8000
Date: Mon Jul 15 18:19:56 2019 +0800
1 file changed, 4 insertions(+), 4 deletions(-)
(py3) jason@jason:~/workspace/mask-detection$ git rebase --continue
Successfully rebased and updated refs/heads/jason.
E,git push origin dev -f 将本地更新推送到远程分支上,必须加上-f,否则我们edit的commit会添加到commit后面
(py3) jason@jason:~/workspace/mask-detection$ git push origin dev -f
Password for 'http://jason@git.sankuai.com': 输入密码
Counting objects: 40, done.
Delta compression using up to 12 threads.
Compressing objects: 100% (40/40), done.
Writing objects: 100% (40/40), 7.75 KiB | 0 bytes/s, done.
Total 40 (delta 31), reused 0 (delta 0)
remote:
remote: Create pull request for jason:
remote: http://git.sankuai.com/users/lvtingxun/repos/mask-detection/compare/commits?sourceBranch=refs/heads/dev
remote:
To http://jason@***.git
+ b26a84a...70929e1 dev -> dev (forced update)
13,删除commit信息
git 删除远程分支上的某次提交_张小强的专栏-CSDN博客_git 删除远程提交 git 删除远程分支上的某次提交
(1),没有push到远端,删除本地commit信息
A,删除最后一次提交记录
git reflog能查看所有历史操作记录,如果只想看commit信息,可以使用git log,两者都能查到commit id
git revert HEAD 将回到倒数第二次提交后的版本,但本次操作会生成commit信息进行提交(输入i进入编辑状态,编辑完信息后按ESC,接着输入:wq保存退出)
保存退出后输出如下,此时已经回退到倒数第二次提交的时候:
通过git log查看提交的记录,发现会生成一次新的commit信息,但是内容已经更新到之前的了
或者
git reset --hard HEAD^ 注意后面有个^表示将回到倒数第二次提交后的版本
操作前的提交记录
操作后的提交记录
git log
[注] revert会生成一次新的提交,之前commit的信息还在,reset 则不会保留之前的提交记录信息
B,删除历史提交中的某次或者多次提交记录
例子:删除最后一次和倒数第三次提交记录
1) git log 找到你要删除的最远的commit id,本次测试选择了红色框的commit信息进行删除,也可以通过git reflog查看commit id
git log
2) git rebase -i HEAD~5 最新提交的版本为倒数第一个版本,5表示倒数第5个版本,这个数字可以修改,如改成3进入下面的编辑页面,或者git rebase -i "commit id"^ 注意后面有个^符号,加不加“”都可以,
git rebase -i HEAD~3 (输入i进入编辑状态,删除第一行的内容,编辑完信息后按ESC,接着输入:wq保存退出)
删除第一行内容和第三行内容,即删除倒数第三次提交和最后一次提交的内容
保存退出后输出如下,此时回到删除改提交之前的那次提交后的状态,即commit信息为“删除commit信息2”
此时git log,回到了要删除commit信息前一次提交的状态
但有冲突,需要解决,冲突的文件内容如下所示
a),解决冲突文件后内容如下
git add .
git rebase --continue (直接退出文件,通过:q退出)
如果没有使用git add . 而直接使用git rebase --continue会提示下面的信息
此时输出如下:
git log发现第三次和第五次提交的commit信息已经删除了
b),不解决冲突,通过git rebase --skip 跳过解决冲突,直接回退到第三次提交后的状态。类似于使用git reset回退
git log
文件中的内容
c),不解决冲突,通过git rebase --abort回到最新提交的状态,所有东西都回到rebase前,因此此时并没有删除commit信息,要想删除就得解决冲突。
git log
(2),已经push到远端,删除本地commit信息和远程commit信息
在(1)完成的基础上,只需要加上git push orgin master -f 即可将master分支上的commit信息删除
git push orgin master -f
远程最新的文档内容:
14,将本地分支推到远程master分支
git push origin dev:master 将本地的dev分支提交到远程的master分支,有冲突需要解决冲突
七、分支策略
1,在实际开发中,我们应该按照几个基本原则进行分支管理:
1),master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
2),干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
3),每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了
2,分支是否推送到远程
1),master分支是主分支,因此要时刻与远程同步;
2),dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
3),bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
4),feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
八、bug分支和暂存工作现场
1,bug分支的用途
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成又不想commit时,先把工作现场暂存,然后去修复bug,修复后,再git stash pop,回到工作现场。
2,创建bug分支的流程
假设暂存现场在dev分支,总体流程如下:
git stash 暂存工作现场
(去修bug,假设bug在master分支上)
git checkout master
修改bug
git add .
git commit -m "fix bug on master"
git push origin master
git checkout dev 切到dev分支
git stash list 会出现stash@{0}: WIP on dev: 6224937 add mergegit
git stash pop 将之前本地dev分支暂存的环境恢复出来
(还可以通过 git stash apply stash@{0}进行恢复,再删除stask内容git stash drop)
git stash list 再次查看还有暂存现场没有
九、feature分支
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,用git branch -d <name>,若要强行删除使用-D
十、github远程仓库
1,使用ssh创建key
为了和远程库相关联需要添加key,如果不加好像每次需要输密码:
ssh-keygen -t rsa -C "***@qq.com" # 后面的邮箱根据自己的情况修改
该命令用于 创建id_rsa文件和id_rsa.pub文件,id_rsa是私钥,id_rsa.pub是公钥用于添加到github的ssh key里面。文件位于用户目录下的.ssh文件里面
2,本地仓库和远程仓库关联
第一种情况:远程只有仓库没有内容时,将本地已经写好的代码关联到远程:
git init
git add .
git commit -m "first commit"
git remote add origin git@github.com:JasonDu1993/learngit.git 关联远程库,相当于让origin等于后面这串地址
git push -u origin master -u只在第一次推送分支时使用,将本地master推到远程master分支上
关联完之后就可以切分支或者创建其他分支了
git checkout master
git push origin master 将到本地master分支内容推到远程master分支上
git checkout -b dev 创建本地dev分支并切换到本地dev分支
git push origin dev 将本地dev分支推到远程dev分支
一般master分支和dev分支都会推到远程
第二种情况:远程仓库有内容,直接克隆到本地
git clone git@github.com:JasonDu1993/gitskills.git
git branch -a 查看本地分支和远程分支
git checkout -b dev origin/dev 如果本地没有dev分支将会报错
git add file_name
git commit -m "记录提交信息"
git push origin dev
在GitHub上,可以任意Fork开源仓库,这样拥有fork后的仓库的读写权限,你就可以push到你fork之后的这个仓库了,当然也可以推送pull request给官方仓库来贡献代码。
3,关联仓库出现问题解决办法
1)如果git checkout -b dev origin/dev迁出分支出现问题
fatal: Cannot update paths and switch to branch 'dev' at the same time.
Did you intend to checkout 'orgin/dev' which can not be resolved as commit?
解决办法是先git fetch,再git checkout -b dev origin/dev
2)如果git push失败,先git pull
如果git pull失败,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:
git branch --set-upstream dev origin/dev,(现在好像改成git branch --set-upstream-to=origin/dev dev)
然后在git pull,git push origin master
3)使用git error: RPC failed; result=22, HTTP code = 411_大笨花猫的博客-CSDN博客
git error: RPC failed; result=22, HTTP code = 411
解决办法:改一下git的传输字节限制
git config http.postBuffer 524288000
4)error: RPC failed; result=22, HTTP code = 413
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly
Everything up-to-date
这两个错误看上去相似,一个是411,一个是413
下面这个错误添加一下密钥就可以了
首先ssh-keygen -t rsa -C "abc@bupt.edu.cn"生成密钥
4,有时候不想解决冲突(建议还是解决冲突好)
1),从远处拉取最新的东西到本地(不想解决冲突直接接受远程仓库内容)
git fetch --all //至少下载到本地不进行合并
git reset --hard origin/dev
git pull
2),将本地更新强制推到远程,不想解决和远程的冲突
git push --force origin dev 或者git push -f origin dev
5,删除远程分支
git push origin --delete dev
删除本地分支
git branch -d dev
6,创建远程分支
如果想把本地的test分支提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支。
git push origin test:master // 提交本地test分支作为远程的master分支
git push origin test:test // 提交本地test分支作为远程的test分支
7,查看远程分支commit信息用于回退到远程分支的某个版本
git fetch --all
git log
git reset --hard commit_id
8,修改远程仓库名称
1) 在本地仓库删除远程仓库:
git remote rm origin
2 )修改Github仓库名称:
在Github页面中,进入要修改的仓库,在页面上方选择“Settings”,即可重命名远程仓库。
3) 添加新的远程仓库:
git remote add origin https://github.com/JasonDu1993/gitskill.git
9,fork别人的仓库后如何同原仓库保持同步更新
Github进行fork后如何与原仓库同步_千淘万漉-CSDN博客_github同步fork仓库 Github进行fork后如何与原仓库同步
1)git remote -v 查看远程目录地址
2)git branch -a 查看所有分支情况
3)git remote add upstream 你fork之前的源仓库地址 该操作将源仓库和上游代码库upstream相关联(重要1)
4)git remote -v 再次查看远程目录的地址
5)git stash 暂存自己的工作状态(不是必须的,如果改了代码没有push则需要)
6)git fetch upstream 抓取源仓库的修改文件(重要2)
7)git branch -a 再次查看所有分支情况
8)git checkout master 切换到master分支
9)git merge upstream/master 将本地代码和源代码保持同步(最重要3)
10)git stash pop 将暂存区的环境恢复到工作区
上传到远程仓库
11)git add .
12) git commit -m "update forked repository at 2019.06.05"
13)git push origin master 上传新的代码到自己的远程master分支
10,git pull can't update
No tracked branch configured for branch dev or the branch doesn't exist. To make your branch track a remote branch call, for example, git branch --set-upstream-to origin/dev dev
11,git关联多个账号
设置一个全局的账户用于公司的项目,然后在设置一个自己的github账号用于分享。参考git设置多账户 - 寒玉知 - 博客园
1)设置一个全局的账户,通过--global实现
git config --global user.name "your_name"
git config --global user.email "your_company_email@mail.com"
2)为全局账号生成 密钥对
ssh-keygen -t rsa -C "your_company_email@mail.com"
在~/.ssh 文件夹下(~ 表示用户目录)已经生成了两个文件,一个是 id_rsa (没有后缀名) , 这个是密钥, 放在自己电脑里的,
另一个是id_ras.pub ,这个是公钥, 里面的内容要复制到github或者gitlab上的, 取决于你想用在哪。
3)为私人账号github生成 密钥对
ssh-keygen -t rsa -C "your_github_email@mail.com" -f ~/.ssh/id_rsa_github
在 ~/.ssh 目录下又多了一对 密钥对 id_rsa_github 和 id_rsa_github.pub,其中的-f表示存储的文件路径。
然后把id_rsa_github.pub 的内容复制到github 账户的这里:
github 点击右上角头像,-》下拉菜单里点Settings -》 进入设置页点左侧 的 “SSH and GPG keys” 这个按钮,-》 然后 new 按钮 到了新增页面,新增一个公钥。
4)把id_rsa_github这个密钥对添加到配置列表,即加入~/.ssh/known_hosts文件里面
ssh-add ~/.ssh/id_rsa_github 如果报错先执行ssh-agent bash这句在在执行下一句
5)测试能否连接到github
ssh -T git@github.com 连接到github的网站
6)克隆了github的仓库到你的电脑之后还需要配置一下github的账号,没有--global参数
git config user.name "your_github_name"
git config user.email "your_github_email@mail.com"
12,切换远程分支并拉取远程分支到本地(创建本地新分支并将新分支和远程某个分支相关联)
当本地不存在dev分支时,即创建一个全新的本地dev分支和远程dev分支相关联
1)git branch -a 查看所有分支,包括远程分支
2)git fetch --all 做这一步的原因是:可能远程创建了一些新的分支,但是本地却没有看到,通过这一步可以同步一下远程分支的情况
3)git checkout -b dev origin/dev 将远程的dev分支拉取到本地并创建本地dev分支
4)git branch 查看是否已经在本地的dev分支了
如果本地有dev分支可能还需要处理冲突,如果不想处理冲突,可以查看第十章第4节,有时候不想解决冲突(建议还是解决冲突好)
13,git不用每次都要输入用户名密码
1)git config credential.helper store .git文件夹的config文件会发现多了两行,这里没有加--global表示只对这个项目起作用
2)后面的操作输入一次账号密码之后就不在需要输入账号密码了
十一、多人合作流程
因此,多人协作的工作模式通常是这样:
首先,可以试图用git push origin branch-name推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
十二、版本标签
标签用于发布版本时使用,相当于给某次commit取个名字
1,添加标签
git tag <name> 用于新建一个标签一般取名name为v0.1等,默认为HEAD,也可以指定一个commit id
git tag -a <tagname> -m "blablabla..." 可以指定标签信息
git tag 可以查看所有标签
2,删除标签
git tag -d <tagname> 删除一个本地标签
git push origin :refs/tags/<tagname> 删除一个远程标签
git push origin <tagname> 推送一个本地标签
git push origin --tags 推送全部未推送过的本地标签
十三,忽略特特殊文件
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件,同时提交这个文件到Git。
例子如下,.gitignore文件内容如下:
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
# iead
.idea
# My configurations:
db.ini
deploy_key_rsa
忽略文件的原则是:
1,忽略操作系统自动生成的文件,比如缩略图等;
2,忽略编译生成的中间文件、可执行文件等,比如Java编译产生的.class文件;
3,忽略敏感信息的配置文件,比如存放口令的配置文件。
十四、自定义Git服务器
假设你已经有sudo权限的用户账号并且该教程是在ubuntu下介绍的
1,安装git:
sudo apt-get install git
2,创建一个git用户,用来运行git服务:
sudo adduser git
3,创建证书登录:
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
4,初始化Git仓库:
先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:
sudo git init --bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:
sudo chown -R git:git sample.git
5,禁用shell登录:
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
6,克隆远程仓库:
现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:
git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.
管理公钥
如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。
管理权限
使用Gitolite就是这个工具管理权限
十五、git常见错误及解决办法
1,git缓存太小下载不下来大文件
解决:git config --global http.postBuffer 524288000
2,有图片文件
Cloning into 'survivors'...
remote: Counting objects: 124, done.
remote: Compressing objects: 100% (120/120), done.
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
解决:git clone http://github.com/large-repository --depth 1
3,更完美的解决下载不下来方法
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
解决:
方法一:git config --global http.postBuffer 524288000
如果不行
方法二:git clone http://github.com/large-repository --depth 1
如果还不行
方法三:一般clone http方式的容易产生此问题,改成SSH的方式也有效,即https://改为git://
4,git remote: HTTP Basic: Access denied 错误解决办法
来源:git remote: HTTP Basic: Access denied 错误解决办法 - lizi0_0 - 博客园
问题描述:
git push 报 HTTP Basic: Access denied 错误
原因:本地git配置的用户名、密码与gitlabs上注册的用户名、密码不一致。
解决方案:
1. 如果账号密码有变动 用这个命令 git config –system –unset credential.helper 重新输入账号密码 应该就能解决了
2. 如果用了第一个命令 还不能解决问题那么 用这个命令:
git config –global http.emptyAuth true
3.如果以上两个方法不起作用,那么采用以下方法:
进入控制面板》用户账号》凭据管理器?windows凭据》普通凭据,在里面找到git,点开编辑密码,更新为最新密码之后就可以正常操作了。