赞
踩
https://github.com/MarkLodato/visual-git-guide
https://www.runoob.com/manual/git-guide/
https://git-scm.com/doc
Ubuntu上openVPN配置参考: https://www.bbsmax.com/A/LPdoRP9G53/
Git 使用指南:https://www.gjtool.cn/pdfh5/pdf.html?file=https://www.gjtool.cn/pdfh5/git.pdf
文档:A Visual Git Reference.pdf(https://github.com/MarkLodato/visual-git-guide)
链接: https://pan.baidu.com/s/11okGic_Dvl0l5DUV4-mg2g
提取码: zada
最开始接触git是因为github网站上有很多开源的强大项目。(所以很长时间我只是从github上clone代码:https://blog.csdn.net/u010637291/article/details/106241389)
但其实git是一个分布式版本控制系统,类似于常用的版本控制工具 CVS, Subversion 等。但不同的是,git采用了分布式版本库的方式,不必服务器端软件支持。
注:版本控制系统在多人共同完成某一项目时很有用,代码同步可省却很多人力,并可方便查看哪个人在什么时候修改了什么内容。
Git 结构如下所示:
windows上安装:https://git-scm.com/
ubuntu上安装: $ sudo apt-get install git
示例1: github上新建repository,本地新建repository并上传到github端(详细过程可参加下一章节)
# github上创建repository: e.g., https://github.com/waerhu/HelloWorld.git
git init # 本地创建repository
git init HelloWorld # 指定本地repository目录
# 本地创建文件README.md并写入内容后
git add README.md # 上传README.md到缓存区index
git status # 查看当前缓存区index未提交到HEAD的内容
git commit -m "Adding a new file - README.md" # 提交缓存区index的内容到HEAD
git remote add origin https://github.com/waerhu/HelloWorld.git # 链接本地工作区到github上的远程库
git push -u origin master # 上传HEAD中内容到远程库
# 详细过程可参加下一章节
示例2:github上已有repository,本地从github端克隆整个项目到本地工作区,修改内容后,再提交到github。
# github已有repository: e.g., https://github.com/waerhu/HelloWorld.git
git clone https://github.com/waerhu/HelloWorld.git # 克隆github端程序到本地
# 本地修改文件README.md后
git add README.md # 上传README.md到缓存区index
git commit -m "Adding content to README.md" # 提交缓存区index的内容到HEAD
git push -u origin master # 上传HEAD中内容到远程库
git config --global user.name 'runoob' # 可自定义用户名
git config --global user.email test@runoob.com # 可自定义email
# 可查看所有的config:
git config --list
git init # 创建repository
git init newrepo # 指定repository目录为newrepo(newrepo可自定义)
git add README.md # 添加单个指定文件(文件可自定义)
git add README.md newfile.txt # 提交多个指定文件
git add * # 提交指定目录下所有文件
git commit -m "note for commitment" # -m 指定注释,注释语可自定义
commit也可直接提交本地工作区内容到HEAD(working dir -> HEAD),即加上参数-a:
# 等同于:
# git add README.md
# git commit -m "note for commitment"
#
git commit -am "note for commitment" # -am
git remote add origin https://github.com/waerhu/HelloWorld.git # 链接到远端库,远端库地址可自定义
git push origin master # 同步到远端库,推送master分支到远程库
# or
git push -u origin master # 第一次同步,需带有-u参数
# 推动另一test分支到orifin远程库
git push origin test
-u:因为远程库是空的,所以我们在第一次推送 master 分支时,要加上 -u 参数,Git不但会把本地的 master 分支内容推送的远程新的 master 分支,还会把本地的 master 分支和远程的 master 分支关联起来,在以后的推送或者拉取时就可以简化命令。
git clone https://github.com/waerhu/HelloWorld.git # 远端库可自定义
git pull origin master
# or
git fetch origin
git reset --hard origin/master
退回/恢复缓存区代码给本地工作区(缓存区index/stage -> 工作区working dir)
git checkout -- README.md # 文件可自定义
退回/恢复/复制HEAD代码到缓存区,或,缓存区和工作区(HEAD -> index/stage 或 HEAD -> index/stage & working dir)
# git reset 默认从HEAD复制到index
git reset
git reset -- hard # 同时copy HEAD到index和working dir
退回/恢复/复制指定文件的HEAD代码到缓存区(HEAD -> index/stage )
# git reset 默认从HEAD复制到index,
# 等同于git reset HEAD -- README.md,
git reset -- README.md # 文件可自定义
类似于退回HEAD内容,也可以回退HEAD上一版本(HEAD~):
退回/恢复/复制指定文件的HEAD~代码到缓存区(HEAD~ -> index/stage & working dir)
git checkout HEAD~ -- README.md # 文件可自定义
如果在回退之前版本同时,需要回退HEAD内容,可用git reset:
退回/恢复HEAD到上3个版本(HEAD -> HEAD~3):
注: HEAD表示当前版本,则HEAD~表示上一个版本,那么上上版本就是HEAD~~,上n个版本即为HEAD~n,如HEAD~3
# HEAD表示当前版本,则HEAD~表示上一个版本,那么上上版本就是HEAD~~,上n个版本即为HEAD~n,如HEAD~3
git reset HEAD~3 # 仅copy HEAD~给stage/index,未copy给working dir
git reset HEAD~3 --hard #copy HEAD~给stage/index和working dir
git reset HEAD~3 --soft #未copy HEAD~给stage/index或working dir
git status
# or
git status -s # 以单行显示结果
git log
#
git log --pretty=oneline # log 展示效果为:一条log为一行
git config format.pretty oneline # 也可直接配置config,使得每次显示历史记录时,每个提交的信息只显示一行
#
git log -3 # 查看最后三次提交记录信息
#
git reflog # 查看历史记录的版本号id
git diff -- README.md # beteen working dir and index/stage
git diff --cached -- README.md # between index/stage and HEAD
git diff HEAD -- README.md # between working dir and HEAD
# 多个文件
git diff testdir/testfile.txt testdir/testfile.c
git diff testdir/*
gitk
git branch # 查看分支
git branch test # 创建分支test,分支名可自定义
git checkout test # 切换到test分支
# or
git checkout –b test # 创建并进入分支
#
git branch –d test # 删除分支test
#
git checkout master # 切换回master分支
git merge test # 合并test分支到主分支master
#
git push origin test # 将test分支推送到远端仓库,不然该分支就是不为他人所见的
ssh-keygen -t rsa -C "test@gmail.com" # email 可自定义
再将密钥文件cat 查看,和复制到git ssh 设置页面。
git remote -v
git diff --binary commitID1 commitID2 > 0001-patchName.patch # 参数--binary表示二进制文件也会添加到patch中
#
git apply --check 0001-patchName.patch # 检查patch文件是否可用,没有显示表示无冲突可直接应用
#
git apply 0001-patchName.patch # 打入patch到当前项目
创建完后,生成HelloWorld repository:
因为此时远程库为空,我们通常为本地写好代码后,直接在本地创建git init repository,再更新到远程库。
当远程库已有我们代码的初版后,可通过git clone克隆到本地。
使用Git前,需要先建立一个仓库(repository)。可以使用一个已经存在的目录作为Git仓库或创建一个空目录。如使用当前目录作为Git仓库,我们只需使它初始化。
git init
使用我们指定目录作为Git仓库。
git init HelloKitty
如创建README.md
cd HelloKitty/
touch READMD.md
vim README.md
# insert: i: This is a new repository, created by waerhu. Esc.
# save: :wq
在创建repository后,会有一个隐藏文件夹.git,可查看该文件夹下内容:
cd .git
ls
Git的结构包括:
1)本地工作区域(即当前本地目录Working Dir),
2)缓存区(Stage或Index):临时保存改动到一个缓存区,
3)HEAD(指向最后一次提交的结果)。
如下图所示:(History即HEAD)
可看到当前.git下有HEAD,但没有index(因为此时还没有添加内容到缓存区)。可通过git add添加文件到index,如添加README.md:
git add README.md
此时,再查看.git文件夹会发现已经有index。
在git add后,我们的更新在缓存区index中,并未进行提交,我们可通过git status查看当前工作区内未提交的内容:
git status
可看到当前缓存区有我们创建的新文件README.md未提交。
提交缓存区的文件到HEAD的操作为(可在提交时添加备注信息,-m后即为备注信息):
git commit -m "Adding a new file - README.md"
此时再查看缓存区index是否有未提交内容,可看到已经没有:
git status
注:可通过 gitk 图形化界面查看commit:
gitk
由于此时我们的repository是本地创建的(git init),还没有链接到远程库,所以我们的链接及推送操作为:
git remote add origin https://github.com/waerhu/HelloWorld.git
其中的http地址即我们在github上创建的空repository地址,如第一节图所示。
如果本地的工作区是从远程库上git clone的,即不需要再次进行链接远程库。
在链接本地工作区到远程库后,可将现在已经在本地HEAD 中的改动提交到远程库:
git push -u origin master
此时github上的远程库已更新:
之前的操作均为,本地repository的内容提交到远程端github端。那么在多人如此操作后,我们本地的repository可能就和远程库github上不一致。
如我们在示例1后进行了示例2操作,此时github上的README.md已经变为:
但此时我们本地的repository的README.md的内容还是原来的:
注:
git status 可查看本地工作区、缓存区index和HEAD间的不一致。此时可看到本地三者之间是同步状态。
git log可查看操作的log。
在本地工作区与远程端不一致时,是无法进行提交本地内容到远程端。 Updates were rejected because the remote contains work that you do not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., ‘git pull …’) before pushing again.
将远程端github上内容同步到本地操作有:
git pull origin master
此时,能看到README.md内容已与github上一致。并且通过git log查看到的log也与github上同步。
此外,同步远程端github上内容到本地的命令还有:
git fetch origin
git reset --hard origin/master
Git在工作时,有本地工作区(即我们的代码编辑),缓存区index(本地.git目录下)和HEAD。这导致我们在一天工作后,想将我们的修改代码提交到服务器端或github端时,需要经过重重的提交:
1)从本地工作区提交到缓存区index:git add
2)从缓存区index提交到HEAD: git commit
3)从HEAD 提交到github端: git push
而这些重重的提交实际上相当于二级缓存,在我们修改代码后或一些误操作后,很容易回退到原始状态。
示例说明如下:
当前工作区working dir, 缓存区和HEAD保存内容一致,修改并提交至:Working dir 有一些内容不在缓存区index,缓存区index有一些内容不在HEAD:
git status
vim README.md # Adding "Content in HEAD" to README.md
git add README.md
git commit -m "Adding content to HEAD"
#
vim README.md # Adding "Content in index" to README.md
git add README.md
#
vim README.md # Adding "Content in index" to README.md
#
git status
此时:
README.md (工作区):
Content in HEAD
Content in index
Content in current working dir
README.md(缓存区index) :
Content in index
Content in current working dir
README.md (HEAD):
Content in HEAD
可看到此时工作区有:
Changes to be committed
Changes to be staged for commit
为了详细看到这些Changes,我们可使用git diff命令:
git diff
git diff --cached
git diff HEAD
git checkout --README.md
2) 缓存区index回退到HEAD
git reset -- README.md
为了查看是否回退成功,我这里将缓存区回退后的内容,再赋给工作区内容:
git status
git checkout -- README.md
cat README.md
git checkout HEAD -- README.md
创建分支,并进入分支,合并分支:
git branch test # 创建分支test
git checkout test # 切换到test分支
#
git checkout master # 切换会master分支
git merge test # 合并test分支到主分支master
删除git本地仓库,即删除.git文件即可:默认情况下.git是隐藏文件夹。可通过如下方式查看
ls -a
Step 1: 删除.git:
rm -rf .git
确认是否删除.git文件,是否还有git相关命令:
ls -a # 没有git文件夹
git status # fatal: Not a git repository (or any parent up to mount point /media/me/nvme2n1) Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
Step 2: 最后删除本地仓库的文件即可:
rm -rf 本地仓库文件夹/
git add 只会将新建的或者已更改的文件添加到索引区,而不会添加删除的文件
git add -u 只会去处理已修改或者已删除的文件,但是不会处理新建的文件
sudo rm test
git add -u
git commit -m "delete test"
git push
发现在本地添加的.pcm文件无法被git status 查找到(并且无法通过git add添加),这是由于在 .gitignore 文件中设置了特定文件不进行版本管理:
cat .gitignore
# 也可根据自己需要自己创建.gitignore
touch .gitignore
如果还是想要上传,可添加 -f 参数。
假设想上传的文件是a.txt, 但b.txt也被修改过(可能还没修改完)
git status -s # 查看状态
git add a.txt
# !!! important!!!
git stash -u -k # 忽略其他文件,把现修改的隐藏起来,这样提交的时候就不会提交未被add的文件
# !!!
git commit a.txt -m "update on a.txt"
git push # 可能需要 git pull
# !!!important!!!
git stash pop # 恢复之前忽略的文件(非常重要的一步)
# !!!
ref: https://blog.csdn.net/weixin_38883338/article/details/96832802
使用git pull出错,错误如下:xxxx仅代表示例
me@2990wx:/media/me/nvme2n1/tmp$ git pull # error shown as follows:
Username for 'https://github.com': xxxx
Password for 'https://xxxx@github.com':
remote: Enumerating objects: 23, done.
remote: Counting objects: 100% (23/23), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 12 (delta 10), reused 12 (delta 10), pack-reused 0
Unpacking objects: 100% (12/12), done.
From https://github.com/xxxx/Txxx
8e91f1c..62e3304 master -> origin/master
Updating 8e91f1c..62e3304
error: Your local changes to the following files would be overwritten by merge:
xxxx.xxxx
xxxx.xxxx
xxxx.xxxx
Please, commit your changes or stash them before you can merge.
Aborting
直接覆盖操作为:
git fetch --all
git reset --hard origin
git pull
如果想将冲突文件保存本地更改的时候,可以将 git reset --hard 换成 git reset --soft
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。