概念
Workspace:工作区
Index / Stage:暂存区
Repository:仓库区(或本地仓库)
Remote:远程仓库
HEAD :想象为当前分支的别名
拉取:会把你本地仓库没有 而远程仓库有的更新写到你本地中,
获取:更多的是用来查看对于你本地仓库的状态来说远程仓库是否有更新,并不会使你的本地仓库发生改变
常用命令
1----将修改放入暂存区:
git add .
2----从暂存区将代码提交到本地
git commit -m tijiao
3----从本地将代码推送到远程
git push
4----从远程拉取
git pull
5----丢弃还没有放入暂存区的修改 也就是丢弃工作区的修改
git checkout -- *
6----暂存区的修改就是已经你已经将文件 add,但是还没有commit的时候。 此时HEAD仍然指向最近一次提交的commit,放弃暂存区的修改,就是将已经放入暂存区的修改退回到工作区中
git reset HEAD
7----强制丢弃工作区和暂存区修改
–方式1
git reset --hard
–方式2
–先将放入暂存区的修改退回到工作区
–再丢弃所有工作区的修改
git reset HEAD
git checkout -- *
8----push或者pull报错1
今天用Git提交代码,先拉取代码的时候,Git报了一个错误:
The requested URL returned error: 429
然后从网上搜索了一下解决方法,原来是提交代码大小的问题,git单个文件默认大小是50M,超过50M,会给出warning。大于100M会无法提交。可以通过命令,修改单个文件默认大小(以设置500M以例):
git config --global http.postBuffer 524288000
9:—贮藏
贮藏就是将工作区的修改保存起来,让工作区恢复干净
git stash
更换sourcetree使用的git
在安装sourcetree的时候一般也会默认安装一个版本的git,这个git称之为sourcetree的内嵌git
查看提交
命令行
git show commitid
soucetree
根据条件筛选:
作者:
提交消息:
文件变化:
常见报错
案例1
fatal: unable to access 'https://github.com/.../.git': Could not resolve host: github.com
解决办法:执行以下命令
git config --global --unset http.proxy
git config --global --unset https.proxy
案例2
Please make sure all processes
are terminated then try again. If it still fails, a git process
may have crashed in this repository earlier:
remove the file manually to continue.
解决办法:
进入到下面这个文件夹里,删掉index.loc即可
案例3:
报错
The authenticity of host '192.168.4.58 (192.168.4.58)' can't be established. ED25519 key fingerprint
解决办法:
其实就是加一个白名单,执行下面命令
在C:\Users\pc.ssh这个文件夹下会生成known_hosts这个文件
ssh -o StrictHostKeyChecking=no 192.168.0.xxx
案例4:
上班的第一天,上司大哥都会说:待会给我发个公钥吧。
这里说的公钥其实就是id_rsa.pub。
上司大哥是要把我们的客户端公钥上传到服务器,然后再把这个客户端公钥添加到authorized_keys。
添加后,服务器就会认为你这个客户端为可信任。你则可以访问这个服务器了。
获取id_rsa.pub
终端输入
ssh-keygen
1
一路回车,最后会看到一个矩形的图案。
你这时ls是看不到.ssh文件夹的。
cd .ssh/
1
这样就会切换到.ssh,再ls
就会看到id_rsa 和id_rsa.pub
给sourcetree添加公玥
第一步:切换客户端 OpenSSH
第二步:你就看到 ssh密钥路径就出现了啊
案例5:
在git文件夹下打开git 命令行
输入路径 可以不跟踪某个文件
git update-index --assume-unchanged path
案例6
git修改用户的名字:
案例7
如果有某个文件,git已经跟踪,但我们不希望再提交他了,也不可以不跟踪它,就是我们人为提交这个文件的时候,会有一个提示,拦截我们,提醒我们无法提交这个文件,此时可以增加一个钩子
比如在git的主目录下有一个main.lua文件,我们可以这么做
生成pre-commit这样一个文件,将这个文件放在.git/hooks文件夹下
文件内容如下:
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".
git diff --cached --name-only | \
grep -E -i "main.lua" && echo && exit 1
exit 0
案例8:
从远程拉取数据报错如下:
git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks fetch origin
remote: HTTP Basic: Access denied
fatal: Authentication failed for 'http://192.168.5.146:8888/fgcs/protocol.git/'
remote: HTTP Basic: Access denied
fatal: Authentication failed for
'http://192.168.5.146:8888/fgcs/protocol.git/'
remote: HTTP Basic: Access denied
fatal: Authentication failed for 'http://192.168.5.146:8888/fgcs/protocol.git/'
remote: HTTP Basic: Access denied
fatal: Authentication failed for 'http://192.168.5.146:8888/fgcs/protocol.git/'
解决办法:
sourcetree 一般安装的时候 会自带一个内置的git 即embedded,但这个git安装下载的时候,往往会出问题,所以我们就自己从官网上下载了git来安装到系统中,最后和github交互的是这个系统中的git,偶尔有一天,你又在sourcetree中下载了内置的git,这样你又把git的使用版本切换到内置版本,所以你无法和之前的github拉取和推送了,这个时候需要重新设置一下
内置的git:生成密钥–》github
系统的git:生成密钥----》github
案例9:
本来是可以推送的,突然就无法推送了,找到密钥的地方
Connection reset by 13.229.188.59 port 22
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
尝试连接github,发现连不上 ,但我们的密钥确实给了github了啊
ssh -T git@github
如下图:发现知道的host出现了两个,还有一个old
解决办法:就是将old的host内容拷贝到 known_hosts这个文件末尾即可
还有一种方案:就是在浏览器上登录github,然后再推送试一下
修改全局配置
解决冲突
认真看完下图
解决冲突以后,记得在sourcetree界面标记冲突已解决
遴选 or cherry-pick
当进行多人合作的时候,遴选的功能就体现出来了,比如很多人都往一个分支上提交代码,那么你每一次提交自己的东西,就会要首先拉取到最新,然后才可以提交你的代码,你这里拉取到最新,其实就是把远程最新的代码拉到你本地,然后和你的内容进行合并,合并完以后,你才可以提交,你这时候提交的东西包含你自己的内容和你拉取下来最新的内容,那么将来有一天,你希望某个分支的某一次提交,你只希望将自己的内容合并出来,那么就可以使用遴选功能了啊
回滚提交
执行回滚提交很容易产生冲突:
我在提交记录3增加一个函数:cjzRiBen4
我在提交记录4增加一个函数:cjzRiBen5
如果我在提交记录3进行回滚,会产生冲突,因为我在提交记录4又对该文件增加了一个函数,所以产生冲突如下:给我以下几种选择,
第一种:HEAD表示当前的改变,存在4和5这两个函数,当前的改变是指当前文件的所有git提交,我们在提交记录4的时候,新增一个函数5,在提交记录3的时候,新增一个函数4,所以当前的改变存在4和5这两个函数
第二种:Incoming表示回滚所产生的改变,删掉了4这个函数,由于在记录3的时候还没有5这个函数,所以,他的改变也不存在5这个函数,因此它将同时删除4和5这两个函数
第三种:两者合并
回滚提交:其实就是删除本次的提交改变,但是如果后边的提交记录存在对本次提交某个文件进行修改,就会产生冲突,就像上面那样,否则不会产生冲突
举个例子:如果我们在某一次提交了一个功能,后边的提交也没有包含对这个功能所牵扯到的任何文件进行修改,忽然策划说这个功能不要了,那么我们就可以很方便的找到这次提交然后进行回滚,就可以一次性删除掉所有的改变的改变文件,还原最初的模样,这是回滚最好的使用,当然如果后边的提交记录存在对本次提交相关的文件修改,那就会修改,这就需要手动解决冲突了,
一句话:回滚提交指的就是我想把我某一次的修改删除掉
回滚区块:
上面说的回滚提交是指对一次大的提交记录进行回滚,回滚区块可以对某一次提交修改的某一个文件的某一处修改,比如:
我们在5进行了回滚提交,删除掉了4和5这两个函数,现在我想加回来,则直接执行回滚区块,然后提交即可
重置当前分支到此次提交
软合并:将当前提交之后的所有改动都提交到暂存区,等待处理
混合合并:将当前提交之后的所有改动都提交到工作区,等待处理
强行合并:将当前提交之后的所有改动都丢弃,无需处理
我们想某一个分支某一个节点以后的提交记录都不要了,如何操作?
就是使用这个操作,
这个操作执行完以后,你的工作区会出现这个节点以后的修改记录,你可以根据你的需要来自己选择是否要保留,一般情况直接丢弃,丢弃完以后你的工作区就干净了,这个时候由于远程和你本地比较,远程的代码还是你本地没有执行重置的代码一样,远程就会出现需要你拉取的情况,此时你需要命令行操作 git push --force,用你的本地强行修改远程,最后你的分支就是下边这张图一样,这个节点以后的提交记录将会被丢弃,ok
此时你心血来潮,想把之前合并的再合回去,按照下边的图示即可