自己学习中的经验记录(各处搬来的),不能保证完全正确或有用,如有问题欢迎交流指正~
主要参考:廖雪峰的Git教程
[toc]
应用学习--同步
用git进行版本管理,主要有以下几种情况:
- 已有本地项目,先创建本地库,再同步到远程库。
- 已有远程库,先克隆到本地,再建立远程连接。
- 已有远程库,先与本地建立连接,再同步。
已有本地项目
可以是有具体内容的项目,也可以是新创建的空目录
创建本地版本库
1、cd到项目目录下;
2、通过==git init==命令把这个目录变成Git可以管理的仓库:
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
因为之前瞎弄已经创建了本地库,我的显示:
$ git init
Reinitialized existing Git repository in D:/Projects/KGQA_HLM/.git/
该路径文档中已经存在了.git 文件,可以在当前文件下的终端中输入ls -a 查看现有的文件.有.git 的话就用
rm -rf .git 删除以后在重新初始化就可以解决了。
添加文件到版本库
使用 ==git add .== 添加全部文件
$ git add .
warning: LF will be replaced by CRLF in .idea/inspectionProfiles/profiles_settings.xml.
The file will have its original line endings in your working directory
问题解析及解决:关于 LF will be replaced by CRLF 问题出现的原因以及解决方式
提交更改到仓库
使用 ==git commit -m '自己的提交说明'== 命令提交改动
$ git commit -m "wrote a readme file"
[master (root-commit) eaadf4e] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
添加远程库
现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。
连接远程库:
(参考廖雪峰Git教程--远程仓库)
第1步:注册GitHub或者gitee账号。
第2步:本地创建SHH key。
在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第3步:登陆GitHub或Gitee,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
点“确定”,就应该可以看到已经添加的Key。
ps:为什么GitHub需要SSH Key呢?因为GitHub/gitee需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub/gitee只要知道了你的公钥,就可以确认只有你自己才能推送。
创建远程库
因为我是已经有了远程库,这里暂不记录创建过程,可参考
廖雪峰Git教程--添加远程库
克隆远程库,建立连接
git bash路径切换到准备存放本地库的路径下;
把远程库直接克隆下来:
$ git clone git@github.com:michaelliao/learngit.git
Cloning into 'learngit.git'...
remote: Enumerating objects: 1584, done.
remote: Counting objects: 100% (1584/1584), done.
remote: Compressing objects: 100% (1408/1408), done.
remote: Total 1584 (delta 159), reused 1578 (delta 158), pack-reused 0
Receiving objects: 100% (1584/1584), 16.33 MiB | 4.08 MiB/s, done.
Resolving deltas: 100% (159/159), done.
然后切换到克隆下来的本地库(learngit)中:
cd learngit
可以看到路径后面多了个"(master)"
w@LAPTOP-7 MINGW64 /d/Datawork/learngit (master)
查看远程库
$ git remote -v
origin git@github.com:michaelliao/learn-git.git (fetch)
origin git@github.com:michaelliao/learn-git.git (push)
可以看到已经建立了连接。并未名字默认是origin。但是我想给gitee上的远程库命名gitee,我的方法的下删除origin关联,再建立新关联。
删除远程库连接,建立新连接
如果添加的时候地址写错了,或者就是想删除远程库,可以用git remote rm <name>命令。使用前,建议先用git remote -v查看远程库信息:
$ git remote -v
origin git@github.com:michaelliao/learn-git.git (fetch)
origin git@github.com:michaelliao/learn-git.git (push)
然后,根据名字删除,比如删除origin:
$ git remote rm origin
此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身并没有任何改动。要真正删除远程库,需要登录到gotee,在后台页面找到删除按钮再删除。
建立新连接:
$ git remote add gitee git@github.com:michaelliao/learngit.git
推送本地内容到远程库
$ git push <远程主机名> <本地分支名>:<远程分支名>
git push origin <branch-name>
$ git push -u origin master
Counting objects: 20, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (20/20), 1.64 KiB | 560.00 KiB/s, done.
Total 20 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To github.com:michaelliao/learngit.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
拉取远程库同步到本地
git pull <remote> <branch>
查看及切换本地或远程分支
查看分支
git 查看所有远程分支以及同步
查看本地仓库分支:
$ git branch
查看远程仓库分支:
$ git branch -r
查看所有分支:
$ git branch -a
查看本地分支及追踪的分支:
$ git branch -vv
切换分支
创建远程origin的dev分支到本地:
$ git checkout -b dev origin/dev
切换到本地其他分支:
git checkout yourOtherBranchName
多人协作
廖雪峰git教程--多人协作
多人协作的工作模式通常是这样:
1.首先,可以试图用git push origin <branch-name>推送自己的修改;
2.如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
3.如果合并有冲突,则解决冲突,并在本地提交;
4.没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。
应用学习--版本回退
查看提交日志
$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:06:15 2018 +0800
append GPL
commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:03:36 2018 +0800
add distributed
commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 20:59:18 2018 +0800
wrote a readme file
git log
命令显示从最近到最远的提交日志.
如果嫌输出信息太多,看得眼花缭乱的,可以加上
--pretty=oneline
参数:
$ git log --pretty=oneline
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
e475afc93c209a690c39c13a46716e8fa000c366 add distributed
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
查看修改内容
git diff
在把修改提交到仓库之前可以用git diff 文件名
查看改动的内容:
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
查看历史命令
Git提供了一个命令
git reflog
用来记录每一次命令:
$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file
跳到指定版本
git reset --hard 版本号/版本标识
首先,Git必须知道当前版本是哪个版本,在Git中,用
HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
1、可以使用git reset
命令把当前版本append GPL
回退到上一个版本add distributed
:
$ git reset --hard HEAD^
HEAD is now at e475afc add distributed
2、还可以在回退到旧版本后再恢复到新版本:
先git reflog
确定新版本的版本号:
$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file
再git reset
跳到新版本:
$ git reset --hard 1094adb
HEAD is now at 1094adb append GPL
版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
查看文件内容
看看readme.txt
的内容是不是想要的版本的:
$ cat readme.txt
Git is a distributed version control system.
Git is free software.
问题解决
error: src refspec master does not match any
error: src refspec master does not match any
error: failed to push some refs to 'gitee.com:########'
fatal: couldn't find remote ref main
往gitee上远程拉取
$ git pull gitee main
fatal: couldn't find remote ref main
git使用报错:fatal: Couldn't find remote ref master的解决方法
换成:
$ git pull gitee master
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), 1.38 KiB | 4.00 KiB/s, done.
From gitee.com:*********
* branch master -> FETCH_HEAD
* [new branch] master -> gitee/master
fatal: refusing to merge unrelated histories
refusing to merge unrelated histories
记Git报错-refusing to merge unrelated histories
出现这个问题的最主要原因还是在于本地仓库和远程仓库实际上是独立的两个仓库。假如我之前是直接clone的方式在本地建立起远程github仓库的克隆本地仓库就不会有这问题了。
查阅了一下资料,发现可以在pull命令后紧接着使用--allow-unrelated-history选项来解决问题(该选项可以合并两个独立启动仓库的历史)。
命令:
$git pull origin master --allow-unrelated-histories
$ git pull gitee master --allow-unrelated-histories
From gitee.com:wang-shisan2021/urban_group_-kg
* branch master -> FETCH_HEAD
CONFLICT (add/add): Merge conflict in README.md
Auto-merging README.md
Automatic merge failed; fix conflicts and then commit the result.
Automatic merge failed; fix conflicts and then commit the result
$ git commit -m 'merge readme'
error: Committing is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.
fatal: Exiting because of an unresolved conflict.
U README.md
AutoMatic merge failed;fix conflicts and then commit the result
意思是:
冲突内容:合并冲突在 XXXX.DS_Store文件中
自动合并失败;修改冲突然后提交修改后的结果。
自动合并失败,这个时候需要去代码中找到冲突的地方,然后分析原因去修改,合并失败的时候一般工程中会有错误提示,如图:
这种冲突首先先分析你们俩个的代码是实现相同功能而写的重复的代码还是各自实现的不同的功能的代码。如果是重复代码:两个二选一删除一个,然后再把这些冲突标示符删除即可;
如果不是重复代码,两个都需要保留,只把冲突符号(红色部分)删除即可。
工程编译通过之后就可以重新提交了,这个时候还需要从头执行:
修改完成后还是:
1.2.1 git add .
1.2.2 git commit -m “给你的保存起一个名字"
1.2.3 git pull 把服务器代码拉下来跟你本地代码合并
1.2.4 git push 把合并好的最新代码推送到服务器端
修改完了之后,按上面的步骤执行既可以了。
$ git add .
$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
(use "git push" to publish your local commits)
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Changes to be committed:
new file: README.en.md
modified: README.md
$ git commit -m "merge reeadme"
[main 6d34373] merge reeadme
远程拉取(默认GitHub?)
$ git pull
Already up to date.
远程推送到github(默认是GitHub?)
$ git push
Enumerating objects: 1582, done.
Counting objects: 100% (1582/1582), done.
Delta compression using up to 12 threads
Compressing objects: 100% (1563/1563), done.
Writing objects: 100% (1580/1580), 16.33 MiB | 1.74 MiB/s, done.
Total 1580 (delta 157), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (157/157), done.
To github.com:*********
28689ad..6d34373 main -> main
远程推送到gitee
$ git push gitee main
Enumerating objects: 1580, done.
Counting objects: 100% (1580/1580), done.
Delta compression using up to 12 threads
Compressing objects: 100% (1561/1561), done.
Writing objects: 100% (1578/1578), 16.33 MiB | 5.29 MiB/s, done.
Total 1578 (delta 158), reused 3 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (158/158), done.
remote: Powered by GITEE.COM [GNK-5.0]
remote: Create a pull request for 'main' on Gitee by visiting:
remote: https://gitee.com/***/*****/pull/new/****:main...********:master
To gitee.com:*********.git
* [new branch] main -> main
换个分支
$ git push gitee master
error: src refspec master does not match any
error: failed to push some refs to 'gitee.com:*****.git'
远程拉取gitee
master:
$ git pull gitee master
From gitee.com:********
* branch master -> FETCH_HEAD
Already up to date.
main:
$ git pull gitee main
From gitee.com:******
* branch main -> FETCH_HEAD
Already up to date.
修改推送语句:
$ git push gitee main:master
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-5.0]
To gitee.*********.git
4ccb428..6d34373 main -> master
成功!