git线上线下库同步及其相关问题

 

操作系统 win10

git 版本:2.22.0.windows.1(git --version 命令查看

写在前面:

git是一款系统软件,是一个平台,它是用来做版本控制的,能很好的管理开发流程,它是分布式的,意味着一个可以通过不同本地进行管理,可以很好的协同teamwork。(一个人活成一个team也不是不行是吧

先放两个链接:

https://git-scm.com/docs  git 官网文档  ,我这里只是作为自己会用到的一些内容,大而全的尤其是自己要用到git的我觉得还是得看git自己的官方文档。

https://www.yiibai.com/git 中文教程,基本上大部分是从楼上那个翻译过来的。

一.线下配置

1 git 安装与登录

git访问可以通过git bash或者其他GUI,本文还是使用git bash。bash作为linux和unix自带的shell,在使用中会遇到很多问题。

git 是open的,所以官网下好就ok,gith bash应该会自带,如果没有就再装一个git bash。

登录命令如下所示,使用你github的名字和邮箱。

git config --global user.name  "mollychen12"
git config --global user.email "xxxx@qq.com"

2 建立本地仓库

cd到某一本地路径,在该文件夹初始化一下git:

git init

会在该目录生成一个.git隐藏文件夹,可用命令 ls -a查看隐藏文件夹。(win 下ctrl+h并不管用

3 将本地文件添加到git

 

git add assert.h #添加单个文件
git add -A       #添加当前本地所有变化到仓库
git add -u       #提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)
git add .        #提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件

4 本地仓库commit注释

git commit -m "add the assert.h"

综上所述在本地配置git,参考git文档case可如下所示

$ cd /path/to/my/codebase
$ git init      (1)Create a /path/to/my/codebase/.git directory.
$ git add .     (2)Add all existing files to the index.
$ git commit    (3)Record the pristine state as the first commit in the history.

注:git status常用来查看文件状态

LF will be replaced by CRLF in testDebug/testDebug.cbp.
The file will have its original line endings in your working directory

这里在使用git add命令 时,由于win上使用bash,其会报错,如上所示,LF和CRLF其实都是换行符,但是不同的是,LF是linux和Unix系统的换行符,CRLF是window 系统的换行符。git有一个自动转换功能关闭该功能即可

git config core.autocrlf false    #当前git 
git config --global core.autocrlf false   #全局有效

 

二.配置线上以及同步

1 创建ssh密钥:

由上图可知啊,通过git系统从线下到github这个线上需要有数据交换,这里url可以用http也可以用ssh密钥来完成连接。

如何配置ssh,首先需要看本地根目录是否有.ssh文件夹

在终端输入

~/.ssh

如果有该 文件夹,打开该文件夹可以看到有两个文件:id_rsa 和id_rsa.pub,用notepad++等记事本文件可以打开然后将后者的所有内容复制到github那个新建密钥的Key框框里。github是头像->settings->SSH and GPG keys->new(Title 随意

如果没有该文件夹,在bash终端输入

ssh-keygen -t rsa -C "github 关联邮箱号"

中间会让你输入保存密钥的文件名和输入密码以及确认密码(如果此时设置以后每次用ssh同步到线上都需要输入密码),为了节省麻烦,这里三次统统回车。不出意外的话现在已经创建好本地ssh了,然后同上操作在线上建立ssh密钥。
2 连接远程库到git系统(git remote 

                                       git  push/fetch

这里的思路是,首先创建连接,其次通过这个连接同步线上线下

git remote add [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url>

添加一个远程,该远程名称为<name>,该仓库url为<url>,name可以自己命名,url可以通过如图所示得到。

比如:

git remote add origin git@github.com:mollychen12/learningOOP.git

即创建了一个远程连接,这个连接的url是git@github.com:mollychen12/learningOOP.git,名称是origin,现在可以通过git remote指令查看线下git有多少个连接了,会出现名称。

建立好连接现在通过origin这个远程来进行同步了。

介绍一下以下四个命令

git push
git pull
git fetch
git merge

git push 是将线下库的数据同步到线上库。一般用到较多的就是

git push <remote> <branch> #通过哪个连接上传到该连接对应的线上库的哪个分支

例如:

git push origin master

我在这里遇到了一个小bug。由于我是将一个本地的A库push到线上的一个B库,(B库并不是一个空库)git将这种合并认为是 不是fast-forwards,会失去history。hmmm用其文档中原话可以认为B是另一个人commit的,A是我要commit的,这会使得分支出现问题:

      B
     /
 ---X---A

这时候用git push 就会出现问题,会报错:

 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:mollychen12/learningOOP.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

首先需要从库中fetch历史记录,创建包含双方所做更改的历史记录,然后将结果push回去。可以执行“ git pull”,解决潜在的冲突,并“ git push”结果。 “ git pull”将在提交A和B之间创建合并提交C。

      B---C
     /   /
 ---X---A
git pull <remote> <branch>  #从remote这个远程连接的某个branch分支获取并融合(merge)进本地库
$ git pull origin master
From github.com:mollychen12/learningOOP
 * branch            master     -> FETCH_HEAD
fatal: refusing to merge unrelated histories

执行完git pull,报了另一个bug。这里将命令改成如下即可。

git pull --allow-unrelated-histories <remote> <branch>

git pull时merge是递归的。

接着再执行命令即可

git push <remote> <branch>

PS:在git文档中还提到,push的时候遇到non-fastforward, 自己push提交A之后(第一张示意图片中),将其替换为“ git commit --amend”以生成提交B,然后尝试将其push out,因为忘记了您已经将Apush out了。 在这种情况下,并且仅当你确定在此期间没有人fetch了较早的这个commit A(并开始在其上构建)时,才可以运行“ git push --force”来覆盖它。 换句话说,“ git push --force”是一种不太建议的方法,用于替换。

三、.gitignore文件的设置

一般在测试代码的时候会产生一些中间文件,且在git所初始化的本地代码仓里很可能我会想放一些文档(比如需求文档以及说明文档。总而言之。不想commit的部分都可以通过.gitignore这个脚本设置(git会读它的

以一份大佬们的gitignore(https://github.com/Tencent/rapidjson.git

文件为例说明一下gitignore的语法规则

/bin/*             #忽略bin目录下所有文件
!/bin/data         #bin目录下data除外(需要被git到repo
!/bin/encodings
!/bin/jsonchecker
!/bin/types
/build             #忽略build该目录
/doc/html          #忽略doc目录下的html文件
/doc/doxygen_*.db  #忽略doc目录下的所有以doxygen_开头,以db结尾的文件
*.a                #忽略所有后缀为a的文件

# Temporary files created during CMake build
CMakeCache.txt
CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
Makefile
RapidJSON*.cmake
RapidJSON.pc
Testing
/googletest
install_manifest.txt
Doxyfile
Doxyfile.zh-cn
DartConfiguration.tcl
*.nupkg

# Files created by OS
*.DS_Store

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值