blob: 9d2e0e79f54901dde3c929810564978b99ae0488 [file] [log] [blame]
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Quy Trình Sử Dụng Git · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the &quot;License&quot;); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --&gt;"/><meta name="docsearch:version" content="4.0.0_Viet"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Quy Trình Sử Dụng Git · Apache SINGA"/><meta property="og:type" content="website"/><meta property="og:url" content="https://singa.apache.org/"/><meta property="og:description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the &quot;License&quot;); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --&gt;"/><meta property="og:image" content="https://singa.apache.org/img/singa_twitter_banner.jpeg"/><meta name="twitter:card" content="summary"/><meta name="twitter:image" content="https://singa.apache.org/img/singa_twitter_banner.jpeg"/><link rel="shortcut icon" href="/img/favicon.ico"/><link rel="stylesheet" href="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.css"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/atom-one-dark.min.css"/><link rel="alternate" type="application/atom+xml" href="https://singa.apache.org/blog/atom.xml" title="Apache SINGA Blog ATOM Feed"/><link rel="alternate" type="application/rss+xml" href="https://singa.apache.org/blog/feed.xml" title="Apache SINGA Blog RSS Feed"/><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400i,700"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Baloo+Paaji+2&amp;family=Source+Sans+Pro:wght@200;300&amp;display=swap"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script src="https://unpkg.com/vanilla-back-to-top@7.1.14/dist/vanilla-back-to-top.min.js"></script><script>
document.addEventListener('DOMContentLoaded', function() {
addBackToTop(
{"zIndex":100}
)
});
</script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>4.0.0_Viet</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class="siteNavGroupActive"><a href="/docs/4.0.0_Viet/installation" target="_self">Docs</a></li><li class=""><a href="/docs/4.0.0_Viet/source-repository" target="_self">Community</a></li><li class=""><a href="/blog/" target="_self">News</a></li><li class=""><a href="https://apache-singa.readthedocs.io/en/latest/" target="_self">API</a></li><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li><li class=""><a href="https://github.com/apache/singa" target="_self">GitHub</a></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line1"></div><div class="line2"></div><div class="line3"></div></div></div><h2><i></i><span>Development</span></h2><div class="tocToggler" id="tocToggler"><i class="icon-toc"></i></div></div><div class="navGroups"><div class="navGroup"><h3 class="navGroupCategoryTitle">Getting Started</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/4.0.0_Viet/installation">Cài đặt</a></li><li class="navListItem"><a class="navItem" href="/docs/4.0.0_Viet/software-stack">Software Stack</a></li><li class="navListItem"><a class="navItem" href="/docs/4.0.0_Viet/examples">Ví Dụ</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Guides</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/4.0.0_Viet/device">Device</a></li><li class="navListItem"><a class="navItem" href="/docs/4.0.0_Viet/tensor">Tensor</a></li><li class="navListItem"><a class="navItem" href="/docs/4.0.0_Viet/autograd">Autograd</a></li><li class="navListItem"><a class="navItem" href="/docs/4.0.0_Viet/optimizer">Optimizer</a></li><li class="navListItem"><a class="navItem" href="/docs/4.0.0_Viet/graph">Model</a></li><li class="navListItem"><a class="navItem" href="/docs/4.0.0_Viet/onnx">ONNX</a></li><li class="navListItem"><a class="navItem" href="/docs/4.0.0_Viet/dist-train">Distributed Training</a></li><li class="navListItem"><a class="navItem" href="/docs/4.0.0_Viet/time-profiling">Time Profiling</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Development</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/4.0.0_Viet/downloads">Tải SINGA</a></li><li class="navListItem"><a class="navItem" href="/docs/4.0.0_Viet/build">Cài đặt SINGA từ Nguồn (Source)</a></li><li class="navListItem"><a class="navItem" href="/docs/4.0.0_Viet/contribute-code">Tham gia viết code</a></li><li class="navListItem"><a class="navItem" href="/docs/4.0.0_Viet/contribute-docs">Tham gia chỉnh sửa Hướng Dẫn Sử Dụng</a></li><li class="navListItem"><a class="navItem" href="/docs/4.0.0_Viet/how-to-release">Chuẩn bị trước khi phát hành</a></li><li class="navListItem navListItemActive"><a class="navItem" href="/docs/4.0.0_Viet/git-workflow">Quy Trình Sử Dụng Git</a></li></ul></div></div></section></div><script>
var coll = document.getElementsByClassName('collapsible');
var checkActiveCategory = true;
for (var i = 0; i < coll.length; i++) {
var links = coll[i].nextElementSibling.getElementsByTagName('*');
if (checkActiveCategory){
for (var j = 0; j < links.length; j++) {
if (links[j].classList.contains('navListItemActive')){
coll[i].nextElementSibling.classList.toggle('hide');
coll[i].childNodes[1].classList.toggle('rotate');
checkActiveCategory = false;
break;
}
}
}
coll[i].addEventListener('click', function() {
var arrow = this.childNodes[1];
arrow.classList.toggle('rotate');
var content = this.nextElementSibling;
content.classList.toggle('hide');
});
}
document.addEventListener('DOMContentLoaded', function() {
createToggler('#navToggler', '#docsNav', 'docsSliderActive');
createToggler('#tocToggler', 'body', 'tocActive');
var headings = document.querySelector('.toc-headings');
headings && headings.addEventListener('click', function(event) {
var el = event.target;
while(el !== headings){
if (el.tagName === 'A') {
document.body.classList.remove('tocActive');
break;
} else{
el = el.parentNode;
}
}
}, false);
function createToggler(togglerSelector, targetSelector, className) {
var toggler = document.querySelector(togglerSelector);
var target = document.querySelector(targetSelector);
if (!toggler) {
return;
}
toggler.onclick = function(event) {
event.preventDefault();
target.classList.toggle(className);
};
}
});
</script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/git-workflow.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Quy Trình Sử Dụng Git</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -->
<h2><a class="anchor" aria-hidden="true" id="dành-cho-lập-trình-viên"></a><a href="#dành-cho-lập-trình-viên" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Dành cho Lập Trình Viên</h2>
<ol>
<li><p>Fork <a href="https://github.com/apache/singa">SINGA Github repository</a> về tài khoản
Github của bạn.</p></li>
<li><p>Clone <strong>repo</strong> (viết tắt của repository) từ tài khoản Github của bạn</p>
<pre><code class="hljs css language-shell">git clone https://github.com/&lt;Github account&gt;/singa.git
git remote add upstream https://github.com/apache/singa.git
</code></pre></li>
<li><p>Tạo branch mới (vd., <code>feature-foo</code> hoặc <code>fixbug-foo</code>), chỉnh sửa và commit
code của bạn ở đây .</p>
<pre><code class="hljs css language-shell">git checkout dev
git checkout -b feature-foo
<span class="hljs-meta">#</span><span class="bash"> write your code</span>
git add &lt;created/updated files&gt;
git commit
</code></pre>
<p>Nội dung lệnh commit nên bao gồm:</p>
<ul>
<li>Tiêu đề (Title) mô tả.</li>
<li>Mô tả chi tiết. Nếu lệnh commit là sửa lỗi (bugs), tốt nhất là nên bao gồm
việc mô tả ngắn gọn lại vấn đề. Nếu thêm tính năng mới, có thể bao gồm động
cơ thúc đẩy/mục đích của tính năng mới này.</li>
</ul>
<p>Nếu branch của bạn có nhiều commits nhỏ, bạn cần súc tích lại các commits
bằng cách</p>
<pre><code class="hljs css language-shell">git rebase -i &lt;commit id&gt;
</code></pre>
<p>Bạn có thể
<a href="https://help.github.com/en/articles/about-git-rebase">squash và reword</a> các
commits.</p></li>
<li><p>Khi bạn đang xử lý các mã code, branch <code>dev</code> của SINGA có thể đang được cập
nhật bởi người khác; Trong trường hợp này, bạn cần pull dev mới nhất</p>
<pre><code class="hljs css language-shell">git checkout dev
git pull upstream dev:dev
</code></pre></li>
<li><p><a href="https://git-scm.com/book/en/v2/Git-Branching-Rebasing">Rebase</a> <code>feature-foo</code>
vào branch <code>dev</code> và push commits vào tài khoản Github của bạn ( branch mới).
Lệnh rebase nhằm giúp cho lịch sử commit của bạn rõ ràng. Các lệnh git dưới
đây nên được thực hiện sau khi bạn commit các việc làm của mình:</p>
<pre><code class="hljs css language-shell">git checkout feature-foo
git rebase dev
git push origin feature-foo:feature-foo
</code></pre>
<p>Lệnh rebase thực hiện các
<a href="https://git-scm.com/book/en/v2/Git-Branching-Rebasing">bước sau</a>: &quot;Lệnh này
thực hiện bắt đầu từ hình thái ban đầu của hai branches (mà bạn đang sử dụng
hoặc bạn đang rebase vào), xác định sự khác nhau ở mỗi commit của branch bạn
đang sử dụng, lưu các điểm khác nhau vào tập tin tạm thời, điều chỉnh branch
hiện tại để có cùng commit với branch mà bạn đang rebase vào, rồi cuối cùng
áp dụng từng thay đổi một theo thứ tự.&quot; Bởi vậy, sau khi thực hiện, bạn sẽ
vẫn ở feature branch, nhưng commit IDs/hashes của bạn được thay đổi do các
điểm khác nhau đã được commit trong quá trình rebase; và branch của bạn giờ
đây chứa bản code cập nhật nhất từ branch dev và branch của bạn.</p></li>
<li><p>Tạo một pull request (PR) vào branch dev của apache/singa trên website
Github. Nếu bạn muốn thông báo cho các thành viên khác đang làm việc trên
cùng một tập tin, bạn có thể tìm tập tin đó trên Github và nhấn vào &quot;Blame&quot;
để xem chú thích từng dòng một ai đã thay đổi code lần cuối cùng. Sau đó, bạn
có thể thêm @username trong mục mô tả PR để nhắc họ. Hãy nói rõ rằng những
đóng góp này là công sức của bạn và rằng bạn cấp bản quyền công sức này cho
dự án theo dạng bản quyền dự án mở. Những commits khác (vd., sửa lỗi) vào
branch mới này sẽ được tự động cập nhật vào pull request của bạn bởi Github.</p></li>
<li><p>Đợi thành viên xét duyệt PR. Trong quá trình này, dev branch của SINGA có thể
được những người khác cập nhật, do vậy bạn cần phải
<a href="https://docs.fast.ai/dev/git.html#how-to-keep-your-feature-branch-up-to-date">merge the latest dev</a>
để xử lý các conflicts. Một số người
<a href="https://github.com/edx/edx-platform/wiki/How-to-Rebase-a-Pull-Request">rebase PR vào branch dev mới nhất</a>
thay vì merging. Tuy nhiên, nếu các thành viên khác fetch PR này để thêm các
tính năng mới rồi gửi PR, việc rebase sẽ gây ra <strong>duplicate commits</strong> (với
hash khác) ở PR mới. Xem
<a href="https://www.atlassian.com/git/tutorials/merging-vs-rebasing">Nguyên tắc vàng để Rebasing</a>
để biết thêm chi tiết khi nào cần tránh rebase. Một giải pháp đơn giản để cập
nhật PR (nhằm xử lý conflicts hay lỗi commit) là checkout một branch mới từ
branch dev cập nhật nhất của Apache SINGAS repo; copy và paste các mã code
được cập nhật/thêm vào; commit và gửi một PR mới.</p></li>
</ol>
<h2><a class="anchor" aria-hidden="true" id="dành-cho-commiters"></a><a href="#dành-cho-commiters" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Dành cho commiters</h2>
<p>Commiters có thể merge pull requests (PRs) vào dev branch của repo upstream.
Trước khi merge mỗi PR, committer nên</p>
<ul>
<li>kiểm tra thông điệp commit (nội dung và định dạng)</li>
<li>kiểm tra những thay đổi so với code hiện tại. Thay đổi về API nên được ghi
lại.</li>
<li>kiểm tra kết quả Travis testing cho định dạng mã code/tài liệu và unit tests</li>
</ul>
<p>Có hai cách để merge một pull request:</p>
<ul>
<li><p>Trên Github. Làm theo <a href="https://gitbox.apache.org/setup/">hướng dẫn</a> để kết nối
tài khoản Apache với tài khoản Github của bạn. Sau đó bạn có thể trực tiếp
merge PRs trên GitHub.</p></li>
<li><p>Để merge pull request <a href="https://github.com/apache/singa/pull/xxx">https://github.com/apache/singa/pull/xxx</a> qua command
line, thực hiện theo hướng dẫn sau:</p>
<pre><code class="hljs css language-shell">git clone https://github.com/apache/singa.git
git remote add asf https://gitbox.apache.org/repos/asf/singa.git
git fetch origin pull/xxx/head:prxxx
git checkout dev
git merge --no-ff prxxx
git push asf dev:dev
</code></pre>
<p>Không sử dụng rebase để merge PR; và vô hiệu hoá fast forward.</p></li>
</ul>
</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/4.0.0_Viet/how-to-release"><span class="arrow-prev"></span><span>How to Prepare a Release</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#dành-cho-lập-trình-viên">Dành cho Lập Trình Viên</a></li><li><a href="#dành-cho-commiters">Dành cho commiters</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/singa-logo-square.png" alt="Apache SINGA" width="66" height="58"/></a><div><h5>Docs</h5><a href="/docs/installation">Getting Started</a><a href="/docs/device">Guides</a><a href="/en/https://apache-singa.readthedocs.io/en/latest/">API Reference</a><a href="/docs/examples">Examples</a><a href="/docs/download-singa">Development</a></div><div><h5>Community</h5><a href="/en/users.html">User Showcase</a><a href="/docs/history-singa">SINGA History</a><a href="/docs/team-list">SINGA Team</a><a href="/blog">SINGA News</a><a href="https://github.com/apache/singa">GitHub</a><div class="social"><a class="github-button" href="https://github.com/apache/singa" data-count-href="/apache/singa/stargazers" data-show-count="true" data-count-aria-label="# stargazers on GitHub" aria-label="Star this project on GitHub">apache/singa-doc</a></div><div class="social"><a href="https://twitter.com/ApacheSINGA" class="twitter-follow-button">Follow @ApacheSINGA</a></div></div><div><h5>Apache Software Foundation</h5><a href="https://apache.org/" target="_blank" rel="noreferrer noopener">Foundation</a><a href="http://www.apache.org/licenses/" target="_blank" rel="noreferrer noopener">License</a><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank" rel="noreferrer noopener">Sponsorship</a><a href="http://www.apache.org/foundation/thanks.html" target="_blank" rel="noreferrer noopener">Thanks</a><a href="http://www.apache.org/events/current-event" target="_blank" rel="noreferrer noopener">Events</a><a href="http://www.apache.org/security/" target="_blank" rel="noreferrer noopener">Security</a></div></section><div style="width:100%;text-align:center"><a href="https://apache.org/" target="_blank" rel="noreferrer noopener" class="ApacheOpenSource"><img src="/img/asf_logo_wide.svg" alt="Apache Open Source"/></a><section class="copyright" style="max-width:60%;margin:0 auto">Copyright © 2023
The Apache Software Foundation. All rights reserved.
Apache SINGA, Apache, the Apache feather logo, and
the Apache SINGA project logos are trademarks of The
Apache Software Foundation. All other marks mentioned
may be trademarks or registered trademarks of their
respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter-wjs'));</script><script>
document.addEventListener('keyup', function(e) {
if (e.target !== document.body) {
return;
}
// keyCode for '/' (slash)
if (e.keyCode === 191) {
const search = document.getElementById('search_input_react');
search && search.focus();
}
});
</script><script>
var search = docsearch({
apiKey: '45202133606c0b5fa6d21cddc4725dd8',
indexName: 'apache_singa',
inputSelector: '#search_input_react',
algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
});
</script></body></html>