GIT学习

Windows安装git

下载https://git-scm.com/downloads 安装无脑下一步

设置名字,邮箱

$ git config –global user.name “Xpand”
$ git config –global user.email “admin@qwas.top

git config 命令的 –global参数,用了这个参数,表示这台机器上所有仓库都会使用这个配置,当然也可以单独给每个仓库配置

创建仓库

cd f: 进入f盘
mkdir gitxuexi 创建gitxuexi文件夹
cd gitxuexi 进入gitxuexi文件夹
pwd 查看当前目录

$ git init 设置这个目录Git可以管理的仓库
Initialized empty Git repository in F:/gitxuexi/.git/
仓库创建会生成.git目录,但目录是隐藏的,可以用ls -ah命令查看
注意:Windows自带的记事本会在每个文件开头添加了0xefbbbf(十六进制)的字符

添加到仓库

编写一个readme.txt文件,
添加git add readme.txt到仓库
提交git commit -m “提交说明”

时光穿梭机

修改文件内容
git status运行查看仓库状态会提示你文件被修改过,但没有准备提交的修改。
git diff查看具体被改动的地方

版本回退

git log查看历史记录
git log –pretty=oneline查看简略记录
上个版本用HEAD^表示,上上个版本用HEAD^^表示,前100版本用HEAD~100
回退命令git reset –hard HEAD^
回到最新git reset –hard <代表版本号的哈希值>
git reflog用来记录你每一次命令

工作区和暂存区

git add 命令实际上就是把要提交的所有修改改到暂放区,然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

管理修改

git diff HEAD – readme.txt
git diff HEAD – <需要比较的文件>
Git是跟踪修改的,每次修改,如果不用git add到暂存区,那就不会加入到commit中

撤销修改

git checkout – readme.txt
git checkout – <需要撤销的文件>
git reset HEAD <需要丢弃修改文件>撤销修改

删除文件

命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。

远程仓库

创建SSH Key
ssh-keygen -t rsa -C “admin@qwas.top

添加远程库

从电脑上连接到github仓库上
git remote add origin git@github.com:xiaopengand/xpand.git
把本地库推送到远程库上
git push -u origin master
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
从现在起,只要本地作了提交,就可以通过命令:

$ git push origin master
把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!
这里遇到了一个问题,花了我半天时间,连不上最后发现只是公司ip被墙了,用自己流量就行了,就这花了我半天时间。

远程仓库克隆

git clone <远程仓库地址>

分支管理

创建与合并分支

查看分支:git branch
创建分支:git branch <需要创建分支名>
切换分支:git checkout <需要切换的分支> 或 git switch <需要切换的分支>
创建+切换分支:git checkout -b 或 git switch -c
合并某分支到当前分支:git merge
删除分支:git branch -d

解决冲突

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用 git log –graph 命令可以看到分支合并图。

分支管理策略

git merge –no-ff -m “更新说明” <合并分支名>
合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出曾经做过合并,而fast forward 合并就看不出来曾经做过的合并。

Bug分支

但手头分支没有完成时,先把工作现场git stash一下,然后去其他分支修复,再git stash pop,回到工作现场;再master分支上修复bug,想要合并到当前dev分支,可以用git cherry-pick 命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

Feature分支

开发一个新的feature,最好新建一个分支
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <需要强制删除的分支名> 强行删除。

多人协作

查看远程仓库:git remote
或者用 git remote -v 显示更详细的信息
显示了push说明有推送权限
推送分支:git push origin master
推送其他分支:git push <远程仓库名称> <其他分支名称>
抓取分支
远程克隆:git clone 仓库地址
git branch 查看分支
git push origin dev 推送dev分支到远程
git checkout -b dev origin/dev 创建远程origin的dev分支到本地

1.首先,可以试图用git push origin 推送自己的修改;
2.如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
3.如果合并有冲突,则解决冲突,并在本地提交;
4.没有冲突或者解决掉冲突后,再用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,如果有冲突,要先处理冲突.

Rebase

  • rebase操作可以把本地未push的分叉提交历史整理成直线;
  • rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比

    标签管理

    创建标签

    创建标签:git tag
    查看标签:git tag
    给历史记录打上标签:git tag
    查看标签信息:git show
    创建带有说明的标签,用-a指定标签名,-m指定说明文字:
    git tag -a v0.1 -m ”标签说明“

    操作标签

    删除标签:git tag -d
    推送标签到远程仓库:git push origin v1.0
    一次性推送全部标签:git push origin –tags
    如果删除远程标签:
    先删除本地git tag -d
    然后从远程删除,删除命令也是push,但格式如下:
    git push origin :refs/tags/

    使用GitHub

    使用Gitee

    使用命令git remote add origin <仓库地址>
    使用gir remote add时报错
    说明本地库已经关联了一个名叫origin的远程库,此时,可以先用git remote -v查看远程信息
    删除已有的github远程库:git remote rm origin
    再关联Gitee的远程库
    git remote add origin <gitee仓库地址>
    通过git push命令就可以把本地库推送到Gitee上。
    一个本地库同时关联到GitHub,又关联Gitee
    git remote add github <github仓库地址>
    git remote add gitee <gitee仓库地址>
    git push github master
    git push gitee master

    自定义Git

    git config –global color.ui true
    这样,Git会适当地显示不同的颜色。

忽略特殊文件

忽略文件的原则是:
1.忽略操作系统自动生成的文件,如缩略图等;
2.忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没有必要放进版本库,比如Java生成的.class文件;
3.忽略你自己带有敏感信息的配置文件,如存放口令的配置文件。
在Git工作区下的根目录创建一个特权的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。GitHub上有各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:配置文件地址https://github.com/github/gitignore
如果你确实添加该文件,可以用-f强制添加到git:
git add -f
或者你发现,可能是.gitignore写的有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查,-v参数查看具体:
git check-ignore -v
把指定文件排除在.gitignore规则外的写法就是!+文件名。

配置别名

git config –global alias.st status
输入git st 表示 git status
–global 参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。
甚至还有人丧心病狂地把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的时候,加上–global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中:
别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。
而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中:

搭建Git服务器

文章参考https://www.liaoxuefeng.com/wiki/896043488029600