工作区:代码区域
暂存区:git add 之后的
本地库:git commit 之后的
远程库:git push 之后到远程库
git命令行:
Tips:git help [reset],reset是具体命令,可以查看具体命令的使用方法
本地库
git init 初始化命令
git config 设置签名
项目级别
git config user.name xxx
git config user.email xxxxxxxx@126.com
系统用户级别(使用这个命令,省事)
git config --global user.name xxx
git config --global user.email xxxxxxxx@126.com
SSH免密登录
在git bash 窗口输入命令:cd ~,进入home目录。rm -r .ssh/,删除./ssh 目录。ssh-keygen -t rsa -C xxxxx@126.com,生成密钥。cd .ssh/,进入到.ssh 目录中。cat
id_rsa.pub,复制密钥内容到,如果是gitlab就在profilesettings,到SSH Keys 输入框中,key框,title随便输入名称
git status 查看工作区,暂存区的状态
git add xxx.txt
git commit -m"xxxx" xxx.txt
版本的前进和后退
查看提交记录
git log
git log --pretty=oneline
git log --oneline(更加简洁)
git reflog (能够查看从当前版本移动到需要的版本需要多少步,能查看所有历史记录)
空格键向下翻页,b键向上翻页,q键退出
前进或者后退
版本前进和回退本质上是对指针(HEAD)的操作
--hard 本地库移动HEAD指针,重置暂存区内容,重置工作区内容
3种方式:基于索引,基于^符号,基于~符号。推荐基于索引进行版本的回退或者前进
基于索引:git reset --hard 678f263
基于^符号:只能后退,git reset --hard HEAD^ (HEAD^^,后退2个版本)
基于~符号:只能后退,git reset --hard HEAD~3 (后退3个版本)
--soft 不对工作区和暂存区造成影响,只是本地版本库的指针指向不同的版本(使用git status 命令会显示有未提交的提醒,但是暂存区本身内容没有改变,只是版本库的移动相对于暂存区
来说不一致了,所以造成了有未提交的提示)
--mixed 工作区不动,本地库移动HEAD指针,重置暂存区内容
删除操作
rm xxx.txt
git add xxx.txt
git commit -m"delete aaa.txt"
添加到暂存区回撤:git reset HEAD xxx.txt
撤销未添加到暂存区的代码修改 git checkout . 撤销所有 or git checkout xxx.txt撤销某个未提交到暂存区的文件
已经commit:git reset --hard 678f263
比较文件差异
git diff xxx.txt 工作区和暂存区进行比较
git diff HEAD xxx.txt 工作区和版本库进行比较
git diff HEAD^ xxx.txt 工作区和历史版本进行比较
不写文件名是多个文件的比较
分支
分支管理的本质是:创建和移动指针。创建分支指针指向版本,HEAD的指针指向不同的分支指针。HEAD-----》master-------》版本
从一个版本fork多个版本出来,每个版本都是一个分支,在不同的版本上进行开发,同时推进开发任务
git branch 查看所有分支
git branch xxx 创建分支
git checkout xxx 切换分支
合并到主分支:切换到master分支,git checkout master。执行merger命令,git merge xxx,将xxx分支上的修改合并到master
产生冲突并解决冲突:
<<<<<<< HEAD
ksjdklfjjsiodfiogtf
=======
ksjdklfjjsiodfiozll
>>>>>>> kkk
以 ======= 为分界线,分界线上面的是当前分支的内容,分界线下面的是另一个分支的内容。此时手动解决冲突,删除特殊符号,可能需要和同事讨论留下那些代码。
方式一:git pull origin master,第一步:解决冲突 。第二步:将解决冲突后的文件执行git add xxx.txt命令。第三步:git commit -m"xxxx"(不能带文件名)
方式二:git pull --rebase origin master,如果出现conflict,第一步:先解决冲突文件。第二步:然后执行git add .第三步:之后接着执行git rebase --continue命令
方式一和方式二合并路径不同,使用哪一种方式都可以
git基本原理
hash 一个系列的加密算法,例如:MD5,CRC32,SHA1。
不管明文数据量有多大,使用同一个加密算法得到的加密后的密文长度固定
输入数据确定,输出数据保持不变
输入数据变化小,输出数据变化大
算法不可逆
git本地库与远程库的交互
创建本地库,在远程创建远程库,将本地库和远程库连接起来。git remote origin add https://github.com/xxxxxx/aaa.git, orgin:作为远程库的别名,这个名字可以随意取
git remote -v 查看与远程库建立的连接
git push origin master,这个命令代表推送当前分支的代码到origin所代表的远程库的master分支
git clone -b dev_name git@xxxxxxxxx 将远程分支clone到本地。初始化本地库,将项目下载下来,创建origin别名。不指定分支默认clone master分支,但实际开发一般是
dev_branch,会指定开发分支进行clone
为某个账号开通push权限:略。。。
作为了解:git pull=git fetch + git merge, git fetch origin master + git merge origin/master = git pull origin master
忽略不需要提交的文件.gitignore
touch .gitignore 创建.gitignore文件
在实际开发过程中,我们往往有许多不需要提交到本地版本库或者远程仓库的文件或者文件夹,这时我们可以创建一个.gitignore文件来添加那些不需要提交到版本库的文件或者文件夹
以斜杠“/”开头表示根目录;例如:/test 仅仅忽略项目根目录下的 test目录及其所有子目录, 不包括非根目录下的test/,例如: ggg/test是不起作用的
/test;忽略所有test目录下的子目录及其文件,不管是不是根目录,还是其他目录下的。例如:/test,/gggg/test。这两个test目录下的子目录及其文件都会被忽略
以星号“”通配多个字符;.txt 忽略所有以.txt后缀结尾的文件,/kkk/* 忽略根目录下的kkk目录下所有文件
以问号“?”通配单个字符
以方括号“[]”包含单个字符的匹配列表;忽略.a ,.b可以写成这样.[ab]
以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;.txt !code.txt忽略所有以.txt结尾的文件但是code.txt除外
.gitignore默认是忽略所有未被track的文件,已经被追踪的需要清除缓存然后在将其纳入.gitignore中。操作步骤如下:
git rm -r --cached .
vim .gitignore 修改里面的内容,将已经被追踪的文件加入到.gitignore中
git status 查看已经被追踪的文件,修改后是否还会出现在git status 列表当中
git add .
git commit -m"xxxxx"
To be continued------