git 简洁说明 - 详解

网上讲git的大部分都是命令用法,看得有些眼花缭乱。

自己总结一下,以一个实际例子来演示日常工作涉及到git的大部分情况,应该主要就分为6种情况:

1.全局配置用户名密码什么的。

2.服务器上新开了一个项目GIT仓库,本地代码需要提交上去。

3.新同事加入和我共同参与这个项目,需要下载远程仓库代码到本地。

4.其他同事修改了远程代码。我这边本地也修改了代码,无法提交。

5.这个项目有一个定制需要新开一个分支,分支怎么管理。

我以一个简单例子为例,阐述这6种情况,至于具体的命令用法,网上搜一下很容易找到。

前提条件:

已经从git管理员那里得到用户名,密码,及远程仓库ssh/http地址。

先大致理解下git的工作流程图:

1.全局配置

# 设置全局用户名和邮箱(必须)
git config --global user.name "你的Gitblit用户名"
git config --global user.email "你的邮箱@company.com"
#明文保存用户名密码
git config --global credential.helper store
#或者启用凭据缓存(避免每次输入密码)
git config --global credential.helper cache
git config --global credential.helper 'cache --timeout=3600'  # 缓存1小时
# 查看配置
git config --global --list

我在本地创建了一个文件夹及一个test.c文件(我只弄了一个文件,实际很多文件),我想把这个文件夹内容上传到git服务器。

先执行本地仓库初始化。

# 初始化Git
git init
# 添加远程仓库
git remote add origin http://118.195.242.85:8898/r/DSP/ADSP21569/git_learning.git
# 检查远程设置
git remote -v

这时候我的本地文件夹多了一个.git的隐藏文件。(如果你看不到,那是文件夹隐藏了.开头的文件,在文件夹选项打开隐藏的项目就可)

2.提交本地代码

我想把本地的代码提交到远程

# 添加所有文件到暂存区
git add .
# 提交到本地仓库
git commit -m "项目初始化"
# 推送到远程(首次推送)
git push -u origin master

好,在push的时候报错了。这是因为远程仓库非空有一个.gitignore文件。这个文件作用是过滤不需要的文件夹和文件如debug,release等编译输出文件。

这时候我需要先拉取后再次push。

# 如果远程非空,需要先拉取
git pull origin master --allow-unrelated-histories
# 解决冲突后再次推送
git push origin master

可以看到,我本地文件夹多了一个文件.gitigore, 同时远程仓库也看到了test.c

3.下载和拉取远程代码

这个就很简单,需要注意的是会在我当前目录下建立一个新的文件夹内容,而不是把远程仓库的内容放到当前目录。

# 直接克隆到当前目录
git clone http://118.195.242.85:8898/r/DSP/ADSP21569/git_learning.git
# 或者指定目录名
git clone http://118.195.242.85:8898/r/DSP/ADSP21569/git_learning.git my-project

4.如何解决冲突

最开始的test.c内容是这样。

int main()
{
printf("hello git.\n");
}

另一个新同事修改了代码,我本地也修改了代码如下(加了一个printf)。

int main()
{
printf("hello git.\n");
printf("starting working...\n");
}

这时候我想上传到服务器。提示错误:

git log --oneline查看记录确实另外一个同事提交了代码。

这个时候需要添加到暂存区,再从远程拉取,解决冲突后在上传。

# 先暂存本地修改
git stash
# 拉取远程最新代码
git pull origin master
# 恢复本地修改
git stash pop

此时有修改的文件前面出现感叹号图标,双击打开解决冲突。

合并修改后再次提交。

int main()
{
int value =5;
printf("hello git. %d\n", value);
printf("starting working...\n");
}
# 添加解决后的文件
git add .
# 提交合并结果
git commit -m "合并更新"
# 推送到远程
git push origin master

5.新开分支管理

我想创建一个新的分支new_feature

# 查看当前分支
git branch
# 创建新分支
git branch new-feature
# 切换到新分支
git checkout new-feature
# 或者创建并切换(一步完成)
git checkout -b new-feature

增加一行代码printf("new freature.");。

int main()
{
int value =5;
printf("hello git. %d\n", value);
printf("starting working...\n");
printf("new freature.");
}

提交到分支

# 在新分支上开发
git add .
git commit -m "实现新功能"
# 推送到远程(创建远程分支)
git push -u origin new-feature

主干修改如何合并到分支呢,或者分支修改如何合并到主干呢?往往这种情况都是针对特定功能或bug进行合并。现在我们在主干上稍作修改,演示如何合并到分支去。

我们切回主干:

git checkout master
git pull

然后修改test.c增加value2,value += value2 及 printf("master function...\n");。 但是此时我只需要合并value2的这个功能到分支,不需要把printf也合并过去。显然不能用git merge(因为它是所并所有提交的改动)

int main()
{
int value =5 , value2=100;
value += value2;
printf("hello git. %d\n", value);
printf("starting working...\n");
printf("master function...\n");
}

先把这段代码提交到主干。

方案一:vscode可视化工具

适用于特定提交的部分功能。其中be52cc 9ec56a分别是主干和分支某次的提交。

# 配置difftool
git config --global diff.tool vscode
git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'
# 交互式查看并选择更改
git difftool -y be52cc 9ec56a

方案二:命令行

适用于确定特定的提交需要全部覆盖到分支。比如我要把主干的新功能全部复制到分支。

#切换到分支
git checkout new_feature
#合并特定修改
git cherry-pick be52cc7

但是提示错误,因为发生了最后一行printf冲突, 选择终止cherry-pick。文件内容不一样,我们手动打开文件进行修改,选择不要,最后提交修改。.

git cherry-pick be52cc7  # 出现冲突
git cherry-pick --abort  # 放弃操作,回到原样

说下git cherry-pick be52cc7 和 git cherry-pick --no-commit be52cc7 区别:

当git cherry-pick be52cc7 成功时会自动创建新的提交到本地仓库,只需要push到远程仓库即可。如果冲突需要使用--abort 参数终止。

git cherry-pick --no-commit be52cc7 明确加了一个选项,不会创建自动提交本地仓库,只是放到了暂存区。

posted @ 2025-09-12 11:07  yfceshi  阅读(9)  评论(0)    收藏  举报