文章目录
- 一、在线文档
- 二、公钥管理
- 三、用户配置
- 四、.gitignore、.gitattribute 文件作用
- 五、Git常用命令
- 5-1、git clone 克隆仓库
- 5-2、git init 初始化仓库
- 5-3、git add 提交暂存区
- 5-4、git commit 提交更新
- 5-5、git push 推送远程
- 5-6、git fetch & pull 区别与使用
- 5-7、git merge & rebase 区别与使用
- 5-8、git branch 分支查看
- 5-9、git checkout 切换分支
- 5-10、git reset 撤消提交
- 5-11、git push 删除分支
- 5-12、git log 日志查看
- 5-13、 添加或指定远程仓库地址
- 5-14、仓库名称与当前文件夹名称相同
- 5-15、git stash
- 5-16、git show
- 5-17、git fetch强制覆盖本地分支
- 六、简单的代码提交流程
- 七、Git常见问题解决
- 1、Git-remote Incorrect username or password ( access token )
- 2、git clone 克隆或下载一个仓库单个文件夹
- 3、git push大文件处理方法
- 4、git pull 时每次都要输入用户名和密码的解决办法
- 5、git status 查看中文乱码问题
- 6、[添加超出范围100M文件](https://www.cnblogs.com/lichuankai/p/10945032.html)
- 7、git status中文文件名编码问题解决
- 8、Java中解决编译 target 文件夹被版本控制
- 9、遇到ssh: connect to host github.com port 22: Connection refused的解决办法
前言:
git是分为三部分,一部分是你自己的文件,另外一个是缓存区,最后一个是本地库。当你修改了自己的文件后,你会git add
xx将修改保存到缓存区,然后再用commit推送修改到本地库中。 git push 将本地仓库修改推送到服务器上的仓库中 commit
是将本地修改保存到本地仓库中
一、在线文档
[官方文档]:https://git-scm.com/docs
[中文文档]:https://git-scm.com/book/zh/v2
二、公钥管理
1、公钥管理
[gitee地址]:https://gitee.com/help/articles/4180
2、生成/添加SSH公钥
[gitee地址]:https://gitee.com/help/articles/4181
[github地址]:https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
ssh-keygen -t ed25519 -C "your_email@example.com"
[gitlab]:
ssh-keygen -o -t rsa -C "your.email@example.com" -b 4096
查看获取
cat ~/.ssh/id_rsa.pub
重要一环,如下图:
3、Git配置多个SSH-Key
[gitee地址]:https://gitee.com/help/articles/4229
4、如何在码云上使用 GPG
[gitee地址]:https://gitee.com/help/articles/4248
三、用户配置
1、设置用户名
$ git config --global user.name “yourname”
2、设置用户邮箱
$ git config --global user.email myemail@qq.com
3、查看git设置列表信息
$ git config --list
4、查看用户名
$ git config user.name
四、.gitignore、.gitattribute 文件作用
gitignore 用于忽略你不想提交到Git上的文件
.gitattribute 指定非文本文件的对比合并方式
.gitigonre 你想要忽略的文件或者目录
/mtk/ 过滤整个文件夹
*.zip 过滤所有.zip文件
/mtk/do.c 过滤某个具体文件
.gitattribute 用于设置文件的对比方式(常用非文本文件)
五、Git常用命令
start a working area (see also: git help tutorial)
clone Clone a repository into a new directory
init Create an empty Git repository or reinitialize an existing one
work on the current change (see also: git help everyday)
add Add file contents to the index
mv Move or rename a file, a directory, or a symlink
restore Restore working tree files
rm Remove files from the working tree and from the index
examine the history and state (see also: git help revisions)
bisect Use binary search to find the commit that introduced a bug
diff Show changes between commits, commit and working tree, etc
grep Print lines matching a pattern
log Show commit logs
show Show various types of objects
status Show the working tree status
grow, mark and tweak your common history
branch List, create, or delete branches
commit Record changes to the repository
merge Join two or more development histories together
rebase Reapply commits on top of another base tip
reset Reset current HEAD to the specified state
switch Switch branches
tag Create, list, delete or verify a tag object signed with GPG
collaborate (see also: git help workflows)
fetch Download objects and refs from another repository
pull Fetch from and integrate with another repository or a local branch
push Update remote refs along with associated objects
5-1、git clone 克隆仓库
1.git clone 不指定分支克隆
- 创建初始文件夹,切换当前文件目录克隆
mkdir tmall-service
cd tmall-service
git clone http://10.1.1.11/service/tmall-service.git
- 指定默认目录:git clone [仓库地址] [本地目录]
git clone http://10.1.1.11/service/tmall-service.git tmall-service
2.git clone 克隆指定分支
- git clone -b [分支名] [仓库地址]
git clone -b dev http://10.1.1.11/service/tmall-service.git
PS: 克隆某分支到本地目录,然后在该目录下push时,对应的就是push到远端的对应分支
5-2、git init 初始化仓库
初始化项目到github、gitee、gitLab
1.未初始化仓库
- 在github、gitee或gitLab新建一个仓库
- 首先进入项目目录,然后初始化一个Git仓库
cd xxx/test
git init
- 添加当前仓库的所有改动
git add .
- 提交当前仓库的所有改动
git commit -m "init" // 参数-m后为当次提交的备注信息
- 推送当前仓库的所有改动
git remote add origin https://gitee.com/xxx/test.git
git push -u origin master
2.已初始化仓库
- 下载github、gitee或gitLab仓库的代码到本地
- 首先把项目中的代码拷贝到仓库对应的本地目录中
- 添加当前仓库的所有改动
git add .
- 提交当前仓库的所有改动
git commit -m "init" // 参数-m后为当次提交的备注信息
- 推送当前仓库的所有改动
git push
5-3、git add 提交暂存区
git add [参数] <路径> 作用就是将我们需要提交的代码从工作区添加到暂存区,就是告诉git系统,我们要提交哪些文件,之后就可以使用git commit命令进行提交了。
为了方便下面都用 . 来标识路径, . 表示当前目录,路径可以修改,下列操作的作用范围都在版本库之内。
1.git add .
他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。
2. git add -u
他仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。add -u 不会提交新文件(untracked file)。(git add --update的缩写)
3.git add -A
是上面两个功能的合集(git add --all的缩写)
PS:
- git add -A 提交所有变化
- git add -u 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)
- git add . 提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件
git版本不同会有所区别:
Git Version 1.x:
Git Version 2.x:
5-4、git commit 提交更新
git commit 主要是将暂存区里的改动提交到本地的版本库。每次使用git commit 命令我们都会在本地版本库生成一个40位的哈希值,这个哈希值也叫commit-id。
commit-id在版本回退的时候是非常有用的,它相当于一个快照,可以在未来的任何时候通过与git reset的组合命令回到这里。
1. git commit -m “message”
-m 参数表示可以直接输入后面的message,如果不加 -m 参数,那么是不能直接输入message的,而是会调用一个编辑器一般是vim来让你输入这个message。
当我们想要提交的message很长或者我们想描述的更清楚更简洁明了一点,我们可以使用这样的格式:
2. git commit -a -m “message”
-a 参数表示,可以将所有已跟踪文件中的执行修改或删除操作的文件都提交到本地仓库,即使它们没有经过git add添加到暂存区。
注意,新加的文件(即没有被git系统管理的文件)是不能被提交到本地仓库的。建议一般不要使用-a 参数,正常的提交还是使用git add先将要改动的文件添加到暂存区,再用git commit 提交到本地版本库。
3. git commit --amend
git commit --amend 也叫追加提交,它可以在不增加一个新的commit-id的情况下将新修改的代码追加到前一次的commit-id中。
1)假如现在版本库里最近的一版正是我们想要追加进去的那版,此时是最简单的,直接修改工作区代码,然后git add,之后就可以直接进行git push到服务器,中间不需要进行其他的操作如git pull等。
2)如果现在版本库里最近的一版不是我们想要追加进去的那版,那么此时我们需要将版本库里的版本回退到我们想要追加的那一版。
2.1> 第一种,如果我们知道我们需要的版本与现在最近的版本中间隔着 n 个提交,那么我们可以直接使用git reset --hard HEAD~n 命令,执行完后运行git log -1 命令我们会发现现在版本库里最近的一版就是我们需要的那版,此时再在工作区直接修改代码,改完之后进行git add,再执行本git commit --amend命令,之后git push。
2.2> 第二种,如果我们不知道我们需要的版本与现在最近的版本中间隔着 n 个提交,那么我们可以使用git log来查看版本库中的commit-id,找到我们需要的commit-id后,在终端中执行git reset --hard commit-id,执行完后运行git log -1 命令我们会发现现在版本库里最近的一版就是我们需要的那版,此时再在工作区直接修改代码,改完之后进行git add,再执行本git commit --amend命令,之后git push。
5-5、git push 推送远程
在使用git commit命令将修改从暂存区提交到本地版本库后,只剩下最后一步将本地版本库的分支推送到远程服务器上对应的分支了,如果不清楚版本库的构成,可以查看我的另一篇,git 仓库的基本结构。
git push的一般形式为 git push <远程主机名> <本地分支名> <远程分支名> ,例如 git push origin master:refs/for/master ,即是将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名。第一个master是本地分支名,第二个master是远程分支名。
1.git push origin master
如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
2.git push origin :refs/for/master
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin –delete master
3.git push origin
如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支
4.git push
如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push,可以使用git branch -r ,查看远程的分支名
PS:
关于 refs/for:
refs/for 的意义在于我们提交代码到服务器之后是需要经过code review 之后才能进行merge的,而refs/heads 不需要
5-6、git fetch & pull 区别与使用
5-7、git merge & rebase 区别与使用
1.git merge 合并分支
合并前要先切回要并入的分支
以下表示要把dev分支合并入master分支
$: git checkout master
$: git merge dev
Merge made by recursive.
README | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
5-8、git branch 分支查看
1.查看本地分支
$ git branch
* master
2.查看远程分支
$ git branch -r
origin/HEAD -> origin/master
origin/dev
origin/master
3.查看所有分支
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/test
remotes/origin/master
PS: git branch -r 无法获取远程分支,ui可以看见分支但是git 命令无法查看
原因 git branch -a 这条命令并没有每一次都从远程更新仓库信息,我们可以手动更新一下
git fetch origin
git branch -a
5-9、git checkout 切换分支
1.git checkout -b [本地分支] origin/[远程分支]
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/master
$ git checkout -b mydev origin/dev
Branch mydev set up to track remote branch Release from origin.
Switched to a new branch 'mydev'
PS: 作用是checkout远程的dev分支,在本地起名为mydev分支,并切换到本地的mydev分支
问题:
Switched to a new branch 'mydev ’
Branch 'mydev ’ set up to track remote branch 'dev ’ from ‘origin’.
切换到新的分支“mydev ”
分支“mydev ”设置为从“源”跟踪远程分支“dev”。
解决方案:
git branch --set-upstream-to=origin/dev mydev -- 将上游设置为 dev
2.git checkout -b [本地分支]
- 新建本地分支
git checkout -b mydev
- 推送本地分支到远端
git push origin mydev:dev
- 设置上游分支为源点
git branch --set-upstream-to=origin/dev mydev
5-10、git reset 撤消提交
1.撤消上一次commit的内容(该操作会彻底回退到某个版本,本地的源码也会变为上一个版本的内容)
git reset --hard <commit-id>
以下表示要撤消“update build gradle configuration file”这一次的commit id,返回到"add battery settings ui"这一次的commit id,
$ git log
commit c8303a9e8db2bcf4edb7488e722a380f4e8858ec (HEAD)
Author: abc <abc@163.com>
Date: Sat Oct 28 09:28:51 2017 +0800
update build gradle configuration file
Change-Id: I9ee532fd0d4698613698a64eb754fb98a8559e32
commit 8d8e5ccf24cf6836ab780aa3860270c3876e825a
Author: abc <abc@163.com>
Date: Sat Oct 28 09:02:01 2017 +0800
add battery settigns ui
Change-Id: Ia907ee4e84f54c00a186d31378a7925a6adaba0e
$ git reset --hard 8d8e5ccf24cf6836ab780aa3860270c3876e825a
HEAD is now at 8d8e5cc add battery settigns ui
$ git log
commit 8d8e5ccf24cf6836ab780aa3860270c3876e825a (HEAD)
Author: abc <abc@163.com>
Date: Sat Oct 28 09:02:01 2017 +0800
add battery settigns ui
Change-Id: Ia907ee4e84f54c00a186d31378a7925a6adaba0e
5-11、git push 删除分支
1.git push origin :[远端分支]
- 删除远端dev分支,推送一个空分支到远程分支,其实就相当于删除远程分支
git push origin :dev
2.git push [仓库名] [本地分支名]:[远程分支]
- 删除指定的远程分支
git push origin --delete dev
5-12、git log 日志查看
git log --pretty=oneline model/BIZ/SPD/Stock/logic/code/dsrc/Stock.java
git show 提交id
5-13、 添加或指定远程仓库地址
git remote set-url origin "https://..."
git config remote.origin.url "https://..."
git remote rm origin-删除
5-14、仓库名称与当前文件夹名称相同
git init
git remote add origin git@github.com:***.git
git pull --rebase origin master
git branch --set-upstream-to=origin/master master
git pull
5-15、git stash
git stash指定文件
git stash push temp.c
git stash -- temp.c
git stash push -m "test" temp.c
# 指定说明信息并stash所有java文件的修改
$ git stash push -m "this is a partly stash test" **/*.java
git stash 解决冲突
1、git pull //提示冲突后
2、git stash //放暂存区
3、git pull //成功拉下代码
4、git stash pop //将暂存区的代码还原,会提示代码冲突,解决冲突代码的文件
5、git add . //重新提交一次
6、git commit -m "冲突"
7、git push
5-16、git show
1.查看最后一次提交记录的修改文件信息
git show --raw
2.查看指定commit id对应修改文件列表
git show --raw commit_id
git show --raw 2f80f1c8bb2cb8e91d22ad38480b681c194f6518
5-17、git fetch强制覆盖本地分支
git 远程分支强制覆盖本地分支–放弃本地修改
git fetch --all
git reset --hard origin/master
git pull
备注:
git fetch 只是下载远程的库的内容,不做任何的合并
git reset 把HEAD指向刚刚下载的最新的版本
六、简单的代码提交流程
git status 查看工作区代码相对于暂存区的差别
git add . 将当前目录下修改的所有代码从工作区添加到暂存区 . 代表当前目录
git commit -m ‘注释’ 将缓存区内容添加到本地仓库
git pull origin master先将远程仓库master中的信息同步到本地仓库master中
git push origin master 将本地版本库推送到远程服务器,
origin是远程主机,master表示是远程服务器上的master分支和本地分支重名的简写,分支名是可以修改的
七、Git常见问题解决
1、Git-remote Incorrect username or password ( access token )
$ git clone https://gitee.com/***.git
Cloning into '***'...
remote: ***@163.com: Incorrect username or password (access token)
fatal: Authentication failed for 'https://gitee.com/***.git/'
解决办法:清除本地的gitee用户名和密码
git config --system --unset credential.helper
2、git clone 克隆或下载一个仓库单个文件夹
地址:https://www.cnblogs.com/zhoudaxiaa/p/8670481.html
1、如果是想克隆别人的项目或者自己的 很简单的一个网站就解决了。DownGit: 只需要找到仓库中对应文件夹的url,输入之后,点击 download 自动打包下载:
(这里说明一下,因为原作者的项目无法使用,这是我修改过的新项目吧,把资源链接改到了国内CDN,所以访问速度很快!)
2、克隆自己的项目 注意:本方法会下载整个项目,但是,最后出现在本地项目文件下里只有需要的那个文件夹存在。类似先下载,再过滤。
有时候因为需要我们只想gitclone 下仓库的单个或多个文件夹,而不是全部的仓库内容,这样就很省事,所以下面就开始教程啦
在Git1.7.0以前,这无法实现,但是幸运的是在Git1.7.0以后加入了Sparse Checkout模式,这使得Check
Out指定文件或者文件夹成为可能。
举个例子:
现在有一个test仓库https://github.com/mygithub/test 你要gitclone里面的tt子目录:
在本地的硬盘位置打开Git Bash
git init test && cd test //新建仓库并进入文件夹
git config core.sparsecheckout true //设置允许克隆子目录
echo 'tt*' >> .git/info/sparse-checkout //设置要克隆的仓库的子目录路径 //空格别漏
git remote add origin git@github.com:mygithub/test.git //这里换成你要克隆的项目和库
git pull origin master //下载
3、git push大文件处理方法
地址:https://www.jianshu.com/p/f4f34c67707a
4、git pull 时每次都要输入用户名和密码的解决办法
在使用https git拉取代码时,每次git pull的时候都会让输入用户名和密码
1.进入项目目录
git config --global credential.helper store
然后会生成一个本地文件用于记录用户名和密码,这个文件我们无需关心
再次git pull一下,会让输入用户名和密码。这次输入之后以后就不会每次输入了。 如果要清除用户名和密码
2.运行一下命令缓存输入的用户名和密码
git config --global credential.helper wincred
3.清除掉缓存在git中的用户名和密码
git credential-manager uninstall
4.warning: LF will be replaced by CRLF in 解决办法
原因是需要提交的文件是在windows下生成的,windows中的换行符为 CRLF, 而在linux下的换行符为LF,所以在执行add . 时出现提示,解决办法:
git config --global core.autocrlf false
再执行git 提交
5.码云 remote: error: GE007: Your push would publish a private email address.
5、git status 查看中文乱码问题
第一步
打开你的终端,依次输入以下命令:
$ git config --global core.quotepath false # 设置 git status utf-8编码
$ git config --global gui.encoding utf-8 # 设置Git GUI界面utf-8编码
$ git config --global i18n.commit.encoding utf-8 #设置commit信息utf-8编码
$ git config --global i18n.logoutputencoding utf-8 # 设置输出 log utf-8 编码
第二步
新建系统环境变量 LESSCHARSET并赋值为utf-8。
以上两步完成后,注销电脑重新进入即可。
解决 Git 在 windows 下中文乱码的问题:https://zhuanlan.zhihu.com/p/357002483
6、添加超出范围100M文件
用这个代码找到100m以上的文件
find ./ -size +100M
将打文件加入git large file storage
git lfs track "name_of_a_giant_file"
#example:
#git lfs track "fc6_W.csv"
加入track之后可以把想要保存的打文件添加到git上
git add path_of_a_giant_file
#example:
#git add vgg16_weight/fc6_W.csv
最后进行提交和推送
git commit -m "Add design file"
git push origin master
7、git status中文文件名编码问题解决
git config --global core.quotepath false
8、Java中解决编译 target 文件夹被版本控制
git rm -r --cached ./project-java/target
git add .
git commit -m 'add target to .gitignore file'
git push
git分支开发的原理:
https://blog.csdn.net/weixin_37861326/article/details/80097198
git——更新分支、提交代码、切换分支、合并分支:
https://www.cnblogs.com/gaoquanquan/p/9501981.html
git从已有分支拉新分支开发:
https://www.cnblogs.com/lingear/p/6062093.html
git clone 指定的单个目录或文件夹:
https://www.cnblogs.com/xkus/p/9692842.html
Git克隆部分文件:
https://www.cnblogs.com/xilifeng/p/5225666.html
Git基础-本地切换分支时被拒绝:
https://blog.csdn.net/qq_39505245/article/details/120066967
9、遇到ssh: connect to host github.com port 22: Connection refused的解决办法
$ git pull
ssh: connect to host github.com port 22: Connection timed out
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
$ ssh -vT git@github.com
OpenSSH_8.8p1, OpenSSL 1.1.1l 24 Aug 2021
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Connecting to github.com [182.43.124.6] port 22.
debug1: connect to address 182.43.124.6 port 22: Connection timed out
debug1: Connecting to github.com [::] port 22.
debug1: connect to address :: port 22: Connection refused
ssh: connect to host github.com port 22: Connection refused
解决:https://zhuanlan.zhihu.com/p/544864281
hosts文件
# Github
140.82.113.4 github.com